获取向量的最后一个元素并将其移动到另一个向量
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);
我正在尝试将向量 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);