беря последний элемент вектора и перемещая его в другой вектор - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь переместить последний элемент вектора old_balls в новый вектор new_balls.

Но когда я вызываю функцию, она не перемещает элемент в новый вектор.

Думаю, я правильно использую функцию перемещения.

std::vector<ball*> old_balls;
std::vector<ball*> new_balls;

void move(std::vector <ball*> ball_box, std::vector <ball*> n_ball_box ){
    new_ball_.push_back(std::move(ball_box[0]));
}

//function call

move(old_balls, new_balls);

ОБНОВЛЕНИЕ : с приведенным ниже кодом я ожидаю, что new_balls будет иметь один элемент old_balls, но я получаю переполнение буфера:

Balls.hpp

Private:
    std::vector<ball*> new_balls;

    void move(std::vector<ball*> ball_box)
    {
        ball* b = ball_box.front();
        ball_box.erase(ball_box.begin());
        new_balls.push_back(b); //don't have to pass new ball because it's member variable
    }

Вот как я вызываю функцию в Main.cpp:

std::vector<ball*> old_balls; //This has 30 ball* elements.

...

ball object;
object.move(old_balls);

1 Ответ

2 голосов
/ 06 мая 2020

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

Кроме того, вы сказали, что хотите переместить элемент last , но на самом деле вы перемещаете первым вместо этого. И вы не удаляете элемент из старого вектора.

Кроме того, нет необходимости использовать std::move() с необработанными указателями. Почему вы вообще используете ball*? Вместо этого вы должны использовать std::unique_ptr<ball>.

Попробуйте что-то вроде этого:

void move(std::vector<ball*> &ball_box, std::vector<ball*> &n_ball_box)
{
    ball* b = ball_box.back();
    ball_box.pop_back();
    n_ball_box.push_back(b);
}

Если вы действительно хотите переместить элемент first , он будет выглядеть вот так:

void move(std::vector<ball*> &ball_box, std::vector<ball*> &n_ball_box)
{
    ball* b = ball_box.front();
    ball_box.erase(ball_box.begin());
    n_ball_box.push_back(b);
}

Тем не менее, если вы переключитесь на std::unique_ptr<ball>, то это будет выглядеть примерно так:

using ball_ptr = std::unique_ptr<ball>;

void move(std::vector<ball_ptr> &ball_box, std::vector<ball_ptr> &n_ball_box)
{
    ball_ptr b = std::move(ball_box.back());
    ball_box.pop_back();
    /* or:
    ball_ptr b = std::move(ball_box.front());
    ball_box.erase(ball_box.begin());
    */
    n_ball_box.push_back(std::move(b));
}

std::vector<ball_ptr> old_balls;
std::vector<ball_ptr> new_balls;
...
move(old_balls, new_balls);
...