如何在 C++ 中的两个向量之间移动项目
How to move items between two vectors in C++
有什么方法可以在不使用复制构造函数的情况下将多个项目从一个 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()));
唯一可行的方法是使用 back_inserter,它可能在内部使用 emplace_back:
//This works
std::move(vct1.begin(), vct1.end(), std::back_inserter(vct2));
但我还需要将新项目插入向量的前面或中间。
由于向量重新分配,我不想一一添加。还有别的办法吗?或者我应该手动创建一个新向量,将其预分配到目标大小并手动逐个移动它?
谢谢
如@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));
有什么方法可以在不使用复制构造函数的情况下将多个项目从一个 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()));
唯一可行的方法是使用 back_inserter,它可能在内部使用 emplace_back:
//This works
std::move(vct1.begin(), vct1.end(), std::back_inserter(vct2));
但我还需要将新项目插入向量的前面或中间。
由于向量重新分配,我不想一一添加。还有别的办法吗?或者我应该手动创建一个新向量,将其预分配到目标大小并手动逐个移动它?
谢谢
如@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));