移动向量c ++的元素

时间:2015-12-09 14:45:37

标签: c++ vector

如何将矢量的某些元素移动到另一个矢量中,同时使原始尺寸更小?我不想制作副本,我想例如:在5个元素的向量中,将第1个元素移动到另一个向量,现在原始元素将有4个元素。

4 个答案:

答案 0 :(得分:2)

首先,您要使用push_back将项目添加到第二个向量,然后使用erase从第一个向量中删除项目。这两个都是std :: vector类的成员。

一个例子:

std::vector<int> vec1, vec2;
//populate the first vector with some stuff
vec1.push_back(1);
vec1.push_back(2);
vec1.push_back(3); // so the vecotr is now { 1, 2, 3}
//Then move item 2 to the second vector
vec2.push_back(vec1[2]);
vec1.erase(2);

编辑: 虽然正如其他人所指出的那样,如果这不是您想要的功能,它看起来可能不是您正在寻找的向量。看看STL containers,看看是否有更符合目的的东西。

答案 1 :(得分:2)

std::vector<std::string> v1 = {"hello", "hello", "world", "c++", "hello", "stuff"};
std::vector<std::string> v2;

auto const pos = std::stable_partition(
    v1.begin(), v1.end(),
    [](std::string const& i) {
        // Condition in here. Return false to "remove" it.
         return "hello" != i;
    });
std::move(pos, v1.end(), std::back_inserter(v2));
// If you don't want to maintain current contents of v2, then
// this will be better than std::move:
// v2.assign(std::make_move_iterator(pos),
//           std::make_move_iterator(v1.end()));
v1.erase(pos, v1.end());

如果你愿意,你可以编写自己的帮助函数来封装它。 See it working here

答案 2 :(得分:1)

您可以使用std::move获取可移动参考。

并非所有类型都允许您移动它们。此外,并不保证您移动的实例处于正确的状态。

移动后,您需要从矢量中删除位置,这将导致所有元素被复制/移动到正确的位置。

答案 3 :(得分:0)

如果您不在乎订购,可以使用:

std::swap(v1[index_of_item],v1.back());
v2.push_back(std::move(v1.back()));
v1.pop_back();