【发布时间】:2016-10-01 18:56:21
【问题描述】:
让我们以std::unique_ptr<T> 中的std::unordered_set 为例。我可以将集合中的一个元素移到其他地方吗?
#include <unordered_set>
#include <iostream>
#include <memory>
#include <vector>
int main()
{
std::unordered_set<std::unique_ptr<int>> mySet;
mySet.insert(std::make_unique<int>(1));
mySet.insert(std::make_unique<int>(2));
mySet.insert(std::make_unique<int>(3));
std::vector<std::unique_ptr<int>> myVector;
for (auto&& element : mySet)
{
std::cout << *element << std::endl;
//myVector.push_back(element); won't compile as you can only get a const ref to the key
}
}
我有一个非常实用的代码示例,我想在其中执行此操作,但减少到使用std::shared_ptr。您知道另一种(更好的?)替代方案吗?
【问题讨论】:
-
请注意,如果
mySet是std::vector,则不会出现此问题;这是node-based containers 特有的。另请注意,如果您成功移动它,它可能会对该设置的未定义行为进行其他操作,因为移动的对象不再有效读取,例如插入或查找,因此在使用容器时必须小心完全没有。 -
@metal 我可能做错了什么,但我只对向量有相同的编译错误,请参阅:coliru.stacked-crooked.com/a/51af3ac220c44619。编辑:我的错,使用
std::move。谢谢 !新代码:coliru.stacked-crooked.com/a/95cb8a827d587723 -
here 描述了一种有用的技术,虽然丑陋但很有效。该代码用于擦除,但可以修改为移动/提取。
标签: c++ c++11 memory containers move