Я пытаюсь вернуть вектор из функции. Мой код компилируется, и я проверил свою функцию и считаю, что ошибка происходит из возвращаемой части. Он компилируется нормально (с использованием Cygwin), но при запуске я получаю ошибку Aborted (core dumped). Вот мой код:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

//function that returns the square
int f(int n)
{
    return n*n;
}
vector<int> myVec;
int counter = 0;
//function that uses f on all elements in a list
vector<int> map(vector<int> something)
{
    //base case
    if(counter == something.size())
    {
        /*cout << "hello" << endl;
        for (int i=0; i<counter; i++)
        {
            cout << "vector: " << myVec[i] << endl;
        }*/
        counter=0;
        return myVec;
    }
    //recursion
    else
    {
        //cout << "counter: " << counter << endl;
        int n = f(something[counter]);
        //cout << "n: " << n << endl;
        myVec.push_back(n);
        //cout << "vector: " << myVec[counter] << endl;
        counter++;
        map(something);
    }
}

int main()
{
    //making vectors
    vector<int> L;
    vector<int> L1;
    vector<int> L2;
    for (int i=0; i<20; i++)
    {
        L.push_back(i);
    }
    L1 = map(L);
}

Код был изначально из файла класса.

0
Hypofreak 3 Апр 2017 в 10:02

2 ответа

Лучший ответ

В свою рекурсию вы ничего не возвращаете. Ожидается, что функция вернет вектор.

В вашем случае, что произойдет, если функция войдет в случай "else" при первом вызове? Он возвращается в map () до тех пор, пока не будет выполнено условие, а затем возвращает вектор. Этот вектор передается на предыдущий рекурсивный вызов и немедленно удаляется, поскольку он не передается дальше.

Решением здесь было бы изменить последнюю строку в другом случае на

return map(something);

Таким образом, значение не теряется и правильно передается исходному абоненту (вашей основной функции).

1
Zinki 3 Апр 2017 в 10:31

ВСЕГДА возвращайте вектор, если ваш тип возврата - вектор. В вашей функции есть ветка, которая ничего не возвращает, и это вызовет проблемы.

vector<int> map(vector<int>& something)
{
    //base case
    if(counter == something.size())
    {
        /*cout << "hello" << endl;
        for (int i=0; i<counter; i++)
        {
            cout << "vector: " << myVec[i] << endl;
        }*/
        counter=0;
        return myVec;
    }
    //recursion
    else
    {
        //cout << "counter: " << counter << endl;
        int n = f(something[counter]);
        //cout << "n: " << n << endl;
        myVec.push_back(n);
        //cout << "vector: " << myVec[counter] << endl;
        counter++;
        map(something); //you should return a vector here
        return std::vector<int>(); //empty vector
    }
}

Также обратите внимание на символ «&», который я добавил при вызове функции, чтобы вектор передавался по ссылке. В противном случае вы передаете копию, которая не будет изменена. Я не знаю, что делает эта функция «карта», поэтому я не могу предложить лучшие модели для того, что вы делаете.

1
The Quantum Physicist 3 Апр 2017 в 07:30