gpt4 book ai didi

c++ - 如何在 C++ 中的两个 vector 之间 move 项目

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:12 24 4
gpt4 key购买 nike

有什么方法可以在不使用复制构造函数的情况下将多个项目从一个 std::vector move 到另一个?

考虑下面的测试代码

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));

但我还需要将新项目插入 vector 的前面或中间。

因为 vector 重新分配,我不想一个一个地添加它。还有别的办法吗?或者我应该手动创建一个新 vector ,将其预分配到目标大小并手动将其逐一 move ?

谢谢

最佳答案

如@rafix07 所述,尽管错误是

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

问题出在缺少 move 赋值运算符

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));

关于c++ - 如何在 C++ 中的两个 vector 之间 move 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57818205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com