首页 > 解决方案 > 如何在 C++ 中的两个向量之间移动项目

问题描述

有什么方法可以在不使用 Copy Constructor 的情况下将多个项目从一个 std::vector 移动到另一个?

考虑以下测试代码

class CTest
{
public:
    int m_value;
    CTest(int n) : m_value(n) {}
    CTest(CTest&& mv) { m_value = mv.m_value; }
    CTest(const CTest& cp) = delete;
};

    std::vector< CTest> vct1;
    vct1.emplace_back(CTest(1));

    //Now move items from vct1 to vct2 to specified position
    std::vector< CTest> vct2;

    //Error: 'CTest &CTest::operator =(const CTest &)': attempting to reference a deleted function
    vct2.insert(vct2.begin(), std::make_move_iterator(vct1.begin()), std::make_move_iterator(vct1.end()));

    //Error: CTest &CTest::operator =(const CTest &)': attempting to reference a deleted function
    std::move(vct1.begin(), vct1.end(), vct2.begin());
    std::move(vct1.begin(), vct1.end(), std::inserter(vct2, vct2.begin()));

唯一可行的方法是使用可能在内部使用 emplace_back 的 back_inserter:

//This works
std::move(vct1.begin(), vct1.end(), std::back_inserter(vct2));

但我还需要在向量的前面或中间插入新项目。

由于矢量重新分配,我不想一个接一个地添加它。还有其他方法吗?或者我应该手动创建一个新向量,将其预分配到目标大小并手动一个接一个地移动它?

谢谢

标签: c++vectorstlmove-semantics

解决方案


正如@rafix07 所指出的,虽然错误是

'CTest &CTest::operator =(const CTest &)': attempting to reference a deleted function

问题在于缺少移动分配运算符

CTest& operator=(CTest&& mv) { m_value = mv.m_value; return *this; }

之后,所有提到的三种方法都有效:

vct2.insert(vct2.begin(), std::make_move_iterator(vct1.begin()), std::make_move_iterator(vct1.end()));
std::move(vct1.begin(), vct1.end(), std::inserter(vct2, vct2.begin()));
std::move(vct1.begin(), vct1.end(), std::back_inserter(vct2));

推荐阅读