list.pushback で、ドキュメントはそれを言う
%list の性質上、この操作は一定時間で実行でき、反復子と参照を無効にしません。
どのように add はイテレータを変更できませんか? 参照を無効にしないとはどういう意味ですか?
ありがとうございました
これは、呼び出しの前に取得されたすべての反復子と参照が、次のpush_back
後にも使用できることを意味します。
std::list<int> numbers { 2, 3, 5, 7};
auto it = numbers.begin();
int& r = numbers.front();
numbers.push_back(11);
std::cout << *it << '\n'; // guaranteed to print 2
std::cout << r << '\n'; // guaranteed to print 2
他のデータ構造は、必ずしもそのような保証を提供するとは限りません。リストの代わりにベクターを使用するとpush_back
、容量が使い果たされる可能性があるため、呼び出しの前に取得されたすべての反復子と参照が無効になる可能性があり、その場合、データをより大きな配列に移動する必要があります。無効な反復子または参照を使用すると、未定義の動作が発生します (読み取り: 何でも起こり得る)。
例として、動作と比較しますstd::vector
。あなたがそうするならそれで:
std::vector<int> foo(1);
std::vector<int>::iterator it = foo.begin();
foo.push_back(2);
*it = 0;
それは違法です - 呼び出しの行為push_back
により、ベクターが成長する可能性があります。この増加により、古い小さなメモリを解放する前に、新しいメモリが割り当てられ、コンテンツがそこに移動されます。
それはstd::list
当てはまりません。これはリンクされたリストであるため、新しい要素を追加してもリスト内の他の要素は変更されません。成長は純粋にローカルなものです。
に要素を追加してlist
も他の要素は変更されないため、これらの要素への反復子と参照は有効なままです