迭代unique_ptr的容器

Dr *_* DR 27 c++ containers iterator unique-ptr

如何在不从容器中取得所有权的情况下访问容器的unique_ptr元素(通过迭代器)?当一个人获得容器中元素的迭代器时,元素所有权仍然与容器有关吗?当一个解引用迭代器来获取对unique_ptr的访问权限时怎么样?这是否执行unique_ptr的隐式移动?

当我需要将元素存储在容器中(而不是通过值)时,我发现我正在使用shared_ptr,即使容器在概念上拥有元素而其他代码只是希望操纵容器中的元素,因为我害怕无法实际访问容器中的unique_ptr元素而不从中获取所有权.

任何见解?

Pas*_*cal 50

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

std::vector< std::unique_ptr< YourClass >> pointers;
for( auto&& pointer : pointers ) {
    pointer->functionOfYourClass();
}
Run Code Online (Sandbox Code Playgroud)

参考&std::unique_ptr避免了复制,你可以使用uniqe_ptr无解引用.

  • 有谁知道在这种情况下使用 `auto &amp;` 和 `auto &amp;&amp;` 之间是否有区别?此参考建议使用 double &amp; http://en.cppreference.com/w/cpp/language/range-for ,两者似乎都可以编译 (6认同)
  • 好问题。我发现 [this link](http://en.cppreference.com/w/cpp/language/auto)(参见说明/1)这表明 `auto&amp;&amp;` 可以作为左值和右值使用,具体取决于初始值设定项。我相应地调整了这个例子。 (2认同)

How*_*ant 16

只要你不试图复制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);
}
Run Code Online (Sandbox Code Playgroud)

如果你(不小心)做了以下的副本unique_ptr:

Ptr p = v[0];
Run Code Online (Sandbox Code Playgroud)

然后你会在编译时发现.它不会导致运行时错误.你的用例就是container<unique_ptr<T>>建造的原因.事情应该正常工作,如果他们不这样做,问题就出现在编译时而不是运行时.所以编写代码,如果你不理解编译时错误,那么回到这里再问一个问题.

  • 您应该可以将其取消引用为:blah&element = ** it; 我认为仍然没有副本。(可能更有用。) (2认同)