36

コンテナから所有権を奪うことなく、(イテレータを介して)コンテナのunique_ptr要素にアクセスするにはどうすればよいですか?コンテナ内の要素へのイテレータを取得するとき、要素の所有権はまだコンテナにありますか?反復子を逆参照してunique_ptrにアクセスする場合はどうでしょうか。それはunique_ptrの暗黙の移動を実行しますか?

コンテナが概念的に要素を所有していて、他のコードが単にコンテナ内の要素を操作したい場合でも、(値ではなく)コンテナに要素を格納する必要がある場合は、shared_ptrを頻繁に使用しています。コンテナから所有権を取得せずに、コンテナ内のunique_ptr要素に実際にアクセスすることはできません。

洞察はありますか?

4

2 に答える 2

67

autoC++11 の範囲ベースの for ループを使用すると、これは比較的洗練されたものになります。

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

&への参照std::unique_ptrはコピーを回避し、uniqe_ptr逆参照せずに を使用できます。

于 2014-12-01T15:05:45.717 に答える
22

のコピーを作成しようとしない限り、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>>構築された理由です。動作するはずですが、動作しない場合は、実行時ではなくコンパイル時に問題が発生します。コンパイル時のエラーを理解していない場合は、ここで別の質問をしてください。

于 2011-11-23T15:07:23.017 に答える