这个问题清楚地阐述了如何将内容从一个std::vector
移动到另一个std::vector
。简而言之,需要进行std::move
调用以物理移动内存,同时还需要进行std::erase
调用来调整原始向量的大小以适应已删除的元素。
使用擦除-删除范式是否存在问题,就像在迭代向量时删除向量一样(例如这里)?
例如,类似于这样的操作:
// Vector with values [0, 1, ..., 19]
std::vector<int> myOldVec;
for (int i = 0; i < 20; i++) { myOldVec.push_back(i); }
// New vector to move into
std::vector<int> myNewVec;
// Move from myOldVec to myNewVec if value is less than 5
myOldVec.erase(
std::remove_if(
myOldVec.begin(),
myOldVec.end(),
[&](const int x)
{
if (x < 5)
{
myNewVec.push_back(x);
return true;
}
return false;
}
),
myOldVec.end()
);
预期输出将会是
myOldVec --> [5, 6, ..., 19]
myNewVec --> [0, 1, 2, 3, 4]
当我运行这段代码时,它在我的测试器中可以工作。但是,当处理对象而不是int时,我担心我实际上并没有“移动”任何东西,而只是引用;例如,使用
std::vector<MyObj>
(使用适当的lambda测试)时是否也是如此。这是否真正执行了移动操作,或者我担心我只是共享一个引用?
int
来说这是可以的。但如果你想更通用和高效地处理对象,你应该使用push_back(std::move(x))
。 - Kurt Stutsmanconst TYPE x
也需要更加明亮。否则你只是移动了一个const副本,TYPE & x
可以解决这个问题。 - user4581301