将项移出STL容器
std::move items out of an STL container?
我正试图将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;
}
相关文章:
- 在STL容器中使用模板类
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 对象 C++ 向量的 STL 容器
- C++ STL:将空容器传递给lower_bound
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在 STL 容器的 STL 容器上调用 clear
- "迭代器"和"const_iterator"不是 STL 容器的必需成员?
- 删除包含包含动态对象的 STL 容器的智能指针
- C++:在子类中扩展静态 STL 容器/映射成员?
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 没有 STL 容器的迭代器
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 接受任何 STL 容器的函数
- C++ STL 容器中优先级搜索的优雅方法
- 我们如何打印出C++ STL 容器的value_type?
- 关联容器(STL)中的等式求值