将项移出STL容器

std::move items out of an STL container?

本文关键字:容器 STL 移出      更新时间:2023-10-16

我正试图将std::move中的一个元素从std::set中删除,然后将其从集合中删除:

std::set<some_type> the_set;
some_type item;   
for (auto iter = the_set.begin(); iter != the_set.end(); iter++)
{
    auto miter = std::make_move_iterator(iter);
    item = std::move(*miter);
    the_set.erase(iter);
    break;
}

编译器不喜欢它,尽管(MSVC 2015):

error C2280: 'some_type &some_type::operator =(const some_type &)': attempting to reference a deleted function

似乎在尝试使用复制构造函数,这是我不想要的。如何让它使用move构造函数?(我尝试了move_iterator绝望,不确定它是否是正确的解决方案在这里)。

std::set迭代器实际上是const迭代器(在c++ 11和更高版本中)。这样,你就不可能改变它们而破坏set的顺序。

你不能从const&&移动。所以你不能移出set

c++ 17将允许您这样做,但通过不同的API (PDF)。基本上,您必须从set中提取节点本身,然后移动节点中的对象,然后销毁节点(通过让它从堆栈中掉下来)。我认为代码应该是这样的:

for (auto iter = the_set.begin(); iter != the_set.end(); iter++)
{
    auto node = the_set.extract(iter);
    item = std::move(node.value());
    break;
}