std :: list要素を参照として管理する方法は?

jscherman

私は次のコードを持っています:

struct Foo {
    int var1;
    int var2;


    friend std::ostream& operator<<(std::ostream& os, const Foo& s){
        return os << "[Foo] " << s.var1 << "," <<  s.var2 ;
    }
};

int main() {
    Foo foo;
    foo.var1 = 1;
    foo.var2 = 2;
    std::list<Foo> list;
    list.push_back(foo);

    Foo &foo2 = list.front();
    foo2.var2 = 5;

    std::cout << "foo (" << &foo << "): " << foo << std::endl;
    std::cout << "foo2 (foo from list) (" << &list.front() << "): " << foo2 << std::endl;
}

との両方foofoo2同じオブジェクトを参照したい私が割り当てるときそう5foo2.var2、私が変更したいと思うfoo.var2だけでなく。しかし、次の出力でわかるように、これは発生していません。

foo (0x7fffffffe140): [Foo] 1,2
foo2 (foo from list) (0x61ac30): [Foo] 1,5 

それを行う正しい方法は何でしょうか?

vsoftco

を使用push_backして要素をリストにpush_back挿入すると、リストに挿入されるコピーが作成されます。解決策はstd::reference_wrapper、リストの基になるタイプとして代わりにを使用することです。

std::list<std::reference_wrapper<Foo>> lst;

そしてそれを次のように押し込みます

lst.push_back(foo);

これは、それがどのように機能するかを示す非常に簡単な例です。

#include <functional>
#include <iostream>
#include <list>

int main() 
{
    int i = 42;
    std::list<std::reference_wrapper<int>> lst;

    lst.push_back(i);           // we add a "reference" into the list
    lst.front().get() = 10;     // we update the list
    std::cout << i;             // the initial i was modified!
}

Live on Coliru

reference_wrapperように参照のリストを単純に作成することはできないため、が必要ですstd::list<Foo&>または、ポインタを使用することもできますが、reference_wrapperアプローチはより透過的です。

上記の簡単な例でstd::reference_wrapper::get()は、基になる参照を取得するためにを使用する必要があること注意してください。これreference_wrapperは、が代入演算子の左側にあり、int[介して暗黙的に変換されないためstd::reference_wrapper::operator T&です。

以下は、reference_wrappersを使用するように変更された完全に機能するコードです

http://coliru.stacked-crooked.com/a/fb1fd67996d6e5e9

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

std :: functionのstd :: vectorを管理する方法

分類Dev

std :: bindをユニバーサル参照型として渡す方法は?

分類Dev

list-initializationを使用して `std :: map <std :: string、CodeInfo>`を初期化する方法は?

分類Dev

参照によりstd :: listから要素を削除します

分類Dev

std :: unordered_mapのstd :: list要素を初期化しています

分類Dev

%AppData%パスをstd :: stringとして取得する方法は?

分類Dev

std :: stringをstd :: stringとしてデマングルする方法

分類Dev

マップは要素をstd :: pairとして保存しますか?

分類Dev

要素がstd :: setにあることを確認する方法は?

分類Dev

std :: sortを使用してstd :: arrayをソートする方法は?

分類Dev

std :: tuple要素をstd :: variantとして取得します

分類Dev

std :: transformとstd :: mem_fnを正しく使用する方法は?

分類Dev

std :: partial_sumを使用してstd :: mapに出力する方法は?

分類Dev

抽出を使用して、コピー不可能な要素をstd :: setからstd :: mapに移動する方法は?

分類Dev

std :: pairの参照メンバーが指している場所を変更する方法はありますか?

分類Dev

std :: move()を使用してr値参照変数を作成することに用途はありますか?[C ++]

分類Dev

Save std::set in std::list

分類Dev

std :: forward_listに保存されている動的要素を削除する方法

分類Dev

std :: listをstd :: copyで複製し、std :: list :: eraseで削除する

分類Dev

std :: listはノードと要素をどのように割り当てますか

分類Dev

条件付きでstd :: stringを参照として割り当てます

分類Dev

std :: nulloptを非定数参照として返します

分類Dev

std :: stringstreamからstd :: string参照をパラメーターとして渡す

分類Dev

std :: moveが右辺値参照を引数として取るのはなぜですか?

分類Dev

std :: listからstructの配列に要素をコピーする方法は?

分類Dev

std :: listに新しい要素を追加することの複雑さ

分類Dev

単一のforループを使用してstd :: map <string、int>とstd :: vector <int>を反復処理する方法は?

分類Dev

ラムダをstd :: unique_ptrのDeleterとして使用する方法は?

分類Dev

空のboost :: functionをstd :: functionとして認識または回避する方法

Related 関連記事

  1. 1

    std :: functionのstd :: vectorを管理する方法

  2. 2

    std :: bindをユニバーサル参照型として渡す方法は?

  3. 3

    list-initializationを使用して `std :: map <std :: string、CodeInfo>`を初期化する方法は?

  4. 4

    参照によりstd :: listから要素を削除します

  5. 5

    std :: unordered_mapのstd :: list要素を初期化しています

  6. 6

    %AppData%パスをstd :: stringとして取得する方法は?

  7. 7

    std :: stringをstd :: stringとしてデマングルする方法

  8. 8

    マップは要素をstd :: pairとして保存しますか?

  9. 9

    要素がstd :: setにあることを確認する方法は?

  10. 10

    std :: sortを使用してstd :: arrayをソートする方法は?

  11. 11

    std :: tuple要素をstd :: variantとして取得します

  12. 12

    std :: transformとstd :: mem_fnを正しく使用する方法は?

  13. 13

    std :: partial_sumを使用してstd :: mapに出力する方法は?

  14. 14

    抽出を使用して、コピー不可能な要素をstd :: setからstd :: mapに移動する方法は?

  15. 15

    std :: pairの参照メンバーが指している場所を変更する方法はありますか?

  16. 16

    std :: move()を使用してr値参照変数を作成することに用途はありますか?[C ++]

  17. 17

    Save std::set in std::list

  18. 18

    std :: forward_listに保存されている動的要素を削除する方法

  19. 19

    std :: listをstd :: copyで複製し、std :: list :: eraseで削除する

  20. 20

    std :: listはノードと要素をどのように割り当てますか

  21. 21

    条件付きでstd :: stringを参照として割り当てます

  22. 22

    std :: nulloptを非定数参照として返します

  23. 23

    std :: stringstreamからstd :: string参照をパラメーターとして渡す

  24. 24

    std :: moveが右辺値参照を引数として取るのはなぜですか?

  25. 25

    std :: listからstructの配列に要素をコピーする方法は?

  26. 26

    std :: listに新しい要素を追加することの複雑さ

  27. 27

    単一のforループを使用してstd :: map <string、int>とstd :: vector <int>を反復処理する方法は?

  28. 28

    ラムダをstd :: unique_ptrのDeleterとして使用する方法は?

  29. 29

    空のboost :: functionをstd :: functionとして認識または回避する方法

ホットタグ

アーカイブ