如何在不从容器中取得所有权的情况下访问容器的unique_ptr元素(通过迭代器)?当一个人获得容器中元素的迭代器时,元素所有权仍然与容器有关吗?当一个解引用迭代器来获取对unique_ptr的访问权限时怎么样?这是否执行unique_ptr的隐式移动?
我发现当我需要在容器中存储元素(而不是按值)时,我正在使用shared_ptr,即使容器在概念上拥有元素而其他代码只是希望操纵容器中的元素,因为我'我担心无法实际访问容器中的unique_ptr元素而没有从中获取所有权。
任何见解?
答案 0 :(得分:41)
使用auto
和C ++ 11的基于范围的for循环,这变得相对优雅:
std::vector< std::unique_ptr< YourClass >> pointers;
for( auto&& pointer : pointers ) {
pointer->functionOfYourClass();
}
&
的引用std::unique_ptr
可以避免复制,您可以在不解除引用的情况下使用uniqe_ptr
。
答案 1 :(得分:15)
只要您不尝试复制unique_ptr
,就可以使用它。您将必须“双重取消引用”迭代器以获取指针的值,就像使用shared_ptr
一样。这是一个简短的例子:
#include <vector>
#include <memory>
#include <iostream>
template <class C>
void
display(const C& c)
{
std::cout << '{';
if (!c.empty())
std::cout << *c.front();
for (auto i = std::next(c.begin()); i != c.end(); ++i)
std::cout << ", " << **i;
std::cout << "}\n";
}
int main()
{
typedef std::unique_ptr<int> Ptr;
std::vector<Ptr> v;
for (int i = 1; i <= 5; ++i)
v.push_back(Ptr(new int(i)));
display(v);
for (auto i = v.begin(); i != v.end(); ++i)
**i += 2;
display(v);
}
如果您(意外)复制unique_ptr
:
Ptr p = v[0];
然后你会在编译时发现。它不会导致运行时错误。您的用例是构建container<unique_ptr<T>>
的原因。事情应该正常工作,如果他们不这样做,问题出现在编译时而不是运行时。所以编写代码,如果你不理解编译时错误,那么回到这里再问一个问题。