迭代unique_ptr的容器



如何访问容器的unique_ptr元素(通过迭代器)而不带走容器的所有权?当一个人在容器中得到一个元素的迭代器时,元素的所有权还在容器中吗?如果对迭代器解引用以获得对unique_ptr的访问呢?这是否执行了对unique_ptr的隐式移动?

我发现当我需要在容器中存储元素(不是按值)时,即使容器在概念上拥有这些元素,而其他代码只是希望操作容器中的元素,我也经常使用shared_ptr,因为我担心在没有所有权的情况下无法实际访问容器中的unique_ptr元素。

见解吗?

使用auto和c++ 11的基于范围的for循环,这变得相对优雅:

std::vector< std::unique_ptr< YourClass >> pointers;
for( auto&& pointer : pointers ) {
    pointer->functionOfYourClass();
}

&std::unique_ptr的引用避免了复制,您可以使用uniqe_ptr而不取消引用。

只要您不试图复制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>>的原因。事情应该正常工作,如果不正常,问题出现在编译时而不是运行时。现在开始写代码吧,如果你不明白编译时的错误,然后在后面问另一个问题。

相关内容

  • 没有找到相关文章

最新更新