Ошибка получения ‘E0415’ при попытке вернуть вектор

#c #function #stdvector

#c #функция #stdvector

Вопрос:

Пытаюсь вернуть завершенную пузырьковую сортировку после ее завершения из функции, и я получаю это:

E0415 не существует подходящего конструктора для преобразования из «std::vector<double, std::allocator<double>> *» в «std ::vector<double, std::allocator<double>>»

Вот код

 class BubbleSort : SortingAlogrithm
{
    void swap(double *xp, double *yp)
    {
        double temp = *xp;
        *xp = *yp;
        *yp = temp;
    }
public:
    vector<double> Sort(vector<double> amp;newVect, int arraySize)
    {
        cout << "Bubble sort algorithm commencing" << endl;
        int i, j;
        for (i = 0; i < arraySize - 1; i  )

            // Last i elements are already in place    
            for (j = 0; j < arraySize - i - 1; j  )
                if (newVect[j] > newVect[j   1])
                    swap(amp;newVect[j], amp;newVect[j   1]);
        cout << "Ordered List: ";
        for (int i = 0; i < arraySize; i  )
        {
            cout << newVect[i] << " ";
        }
        return amp;newVect;
    }
};
  

Комментарии:

1. Измените оператор return на return newVect , и проблема исчезнет.

2. return amp;newVect; Ваша функция возвращает по значению, в то время как вы пытаетесь вернуть по указателю.

3. Вы действительно хотите частное наследование?

4. @NeilButterworth что вы имеете в виду?

5. class BubbleSort : SortingAlogrithm это частное наследование. обычно предпочтительнее публичное наследование.

Ответ №1:

 return amp;newVect;
  

является синтаксически некорректным, поскольку возвращаемый тип является std::vector<double> и amp;newVect имеет тип std::vector<double>* .

Это то, на что жалуется компилятор.

Вам нужно использовать

 return newVect;
  

Предложение по улучшению

Будет лучше изменить возвращаемый тип на ссылочный, чтобы вы не заставляли вызывающую функцию создавать копию при вызове функции.

 vector<double>amp; Sort(vector<double> amp;newVect, int arraySize)
{
   ...
   return newVect;
}
  

Все же лучше изменить возвращаемый тип на void , поскольку вызывающая функция сортирует объект.

 void Sort(vector<double> amp;newVect, int arraySize)
{
   ...
   // Not return statement
}
  

Комментарии:

1. В вашем примере нет необходимости возвращать по ссылке, потому что параметр уже передан по ссылке, поэтому любое изменение параметра повлияет на аргумент.

2. @Raindrop7, верно.

3. @RSahu Если бы я изменил возвращаемый тип на void, смог бы я использовать его в своей основной функции? Моя главная цель в целом в этом проекте — программа, которая сравнивает эффективность различных алгоритмов сортировки с разными наборами данных

4. @TavianT, Да, ты определенно можешь.

5. @TavianT, если вы хотите сохранить оригинал std::vector , чтобы иметь возможность сравнивать различные методы сортировки, вам нужно будет сделать копии исходного вектора и передать копии функциям сортировки.