![](/img/trans.png)
[英]boost multi_index - how to add an element from one container to another if its type is move-only?
[英]How to get a move-only type out of a STL container?
我们以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
。 你知道另一个(更好吗?)的选择吗?
在C ++ 03,C ++ 11和C ++ 14中,不是直接的。 您必须将类型更改为:
template <class T>
struct handle {
mutable std::unique_ptr<T> owning_ptr;
T* observing_ptr; // enforce that observing_ptr == owning_ptr.get() on construction
// define operator<, hash, etc. in terms of the observing ptr
};
有了这个,你可以写:
std::unordered_set<handle<int>> mySet;
// initialize as appropriate
for (auto& elem : mySet) {
myVector.push_back(std::move(elem.owning_ptr));
}
mySet.clear();
这仍然是明确定义的行为,因为我们没有搞乱任何容器内部 - 观察指针在clear()
结束时仍然有效,只是现在myVector
拥有它。
在C ++ 17中,我们可以在extract()
的帮助下直接更简单地执行此操作:
for (auto it = mySet.begin(); it != mySet.end();
{
std::cout << **it << std::endl;
myVector.push_back(std::move(
mySet.extract(it++).value()));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.