Вернуть вектор класса по ссылке в c ++ [duplicate]

0

У меня есть функция, которая возвращает вектор класса:

vector<movement> returnMoves(int startx, int starty, int bb[][8], int side){

vector<movement> moves;
movement adding;
moves.push_back(adding); moves.push_back(adding); //example

return moves;
}

И я вызываю функцию таким образом из основного:

vector<movement> t1;
t1 = returnMoves(startx, starty, bb, 1);

Он работает, но этот процесс выполняется много раз, и он медленный, поэтому я бы хотел сделать это быстрее, поэтому я рассматривал возможность возврата по ссылке или указателями: вот что я пробовал:

vector<movement> & returnMoves(int startx, int starty, int bb[][8], int side){
vector<movement> temp1;
vector<movement>& moves = temp1;
moves.push_back(adding); moves.push_back(adding);
return moves;
}

и называя его таким же образом:

 t1 = returnMoves(startx, starty, bb, 1);

Это дает мне ошибку сегментации, что я делаю неправильно?

  • 0
    вы ссылаетесь на неопределенные указатели.
  • 1
    std::vector уже является просто ссылкой на фактическую память, содержащую объекты, поэтому ваш исходный код просто копирует ссылки (если NRVO не применяется для конструирования вектора непосредственно там, где это требуется вызывающей стороне). В этом преимущество C ++ 11 «перемещение конструктора / перемещение». Если вы видите замедление от исходного, правильного кода, найдите лучший компилятор.
Показать ещё 7 комментариев
Теги:
class
vector
return
reference

1 ответ

3

Вы возвращаете ссылку на локальную переменную. Переменная temp1 выходит за пределы области после returnMoves выходы, что приводит к неопределенному поведению. Если вы хотите избежать копирования, вы можете просто передать объект, который хотите заполнить следующим образом:

void generateReturnMoves(vector<movement>& populateThis, int startx, int starty, int bb[][8], int side){
//Add all the movement objects you need to populateThis
}

Теперь вы можете использовать его как:

vector<movement> t1;
generateReturnMoves(t1, startx, starty, bb, 1);
  • 1
    Вместо этого вы можете вернуть указатель, но вам придется выделить вектор с новым. Либо выделите в функции, либо попросите клиента передать выделенный указатель. Просто убедитесь, что ясно, что тот, кто использует функцию, отвечает за вызов delete после завершения.
  • 0
    спасибо Pradhan, есть ли шанс, что вы можете сказать мне, что именно изменить? Я еще не знаком с указателями
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню