获取向量的最后一个元素并将其移动到另一个向量

taking the last element of a vector and moving it to another vector

我正在尝试将向量 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);

UPDATE:使用下面的代码,我希望 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);

您正在按值传递向量,因此您作用于向量的副本,而不是原始个向量。您需要通过引用传递向量

此外,您说要移动 last 元素,但实际上您移动的是 first 元素。而且您没有从旧向量中删除元素。

此外,没有必要对原始指针使用 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);
}

如果您真的想移动 第一个 元素,那么它将看起来像这样:

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);