• ベストアンサー

STL LIST のイテレータ

listのイテレータを保持して listをソート(または移動、交換など)するとイテレータが指す場所は 1,以前と同じ場所 2,ソート後の場所 どちらでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  2では? ただ、イテレータが指しているメモリ位置は以前と同じでは(前後関係の連結が組み替えられただけの筈)。  以下で確認出来ます。 static void print(const std::list<int>::reference r) { cout<< "[pointer : " << &r << " ][value : " << r << " ]" << endl; } int main(void) { const int a[] = {1,3,2,4,0}; std::list<int> ls(a, a + 5); std::list<int>::iterator it = ls.begin(); std::advance(it, 1); cout << "[以前]" << endl; cout << "[単体]" << endl; print(*it); cout << "[全体]" << endl; std::for_each(ls.begin(), ls.end(), &::print); ls.sort(); cout << "[以後]" << endl; cout << "[単体]" << endl; print(*it); cout << "[全体]" << endl; std::for_each(ls.begin(), ls.end(), &::print); cout << "[変更]" << endl; *it = 15; std::for_each(ls.begin(), ls.end(), &::print); }

FBH754HGH
質問者

お礼

解凍ありがとうございました

その他の回答 (2)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

std::listの要素のinsertやerase、splice を行っても、 その操作前に取得したstd::list のイテレータは、 操作後も操作前と同じ要素を指したまま有効な状態になっています。 (当然ながら、erase した要素を指していたイテレータだけは無効になりますが) ですから、ANo.2 は誤りです。 sort のアルゴリズムによりますが、基本的にイテレータは「ソート前と同じ要素」を指しています。 (ANo.1 の例であれば、イテレータ it が指す要素はソート前もソート後も3のままであり、 ソート前は先頭から2番目の要素を指すイテレータだったのが、ソート後は先頭から4番目の要素を指すイテレータになっている。)

FBH754HGH
質問者

お礼

解凍ありがとうございました

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

listにデータ操作を加えた後は、それ以前に取得したイテレータの動作は保証 されないと思います。 例えば、ソートや、データの追加、削除を行った場合。

FBH754HGH
質問者

お礼

解凍ありがとうございました

関連するQ&A