- ベストアンサー
STL LIST のイテレータ
listのイテレータを保持して listをソート(または移動、交換など)するとイテレータが指す場所は 1,以前と同じ場所 2,ソート後の場所 どちらでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 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); }
その他の回答 (2)
- mtaka2
- ベストアンサー率73% (867/1179)
std::listの要素のinsertやerase、splice を行っても、 その操作前に取得したstd::list のイテレータは、 操作後も操作前と同じ要素を指したまま有効な状態になっています。 (当然ながら、erase した要素を指していたイテレータだけは無効になりますが) ですから、ANo.2 は誤りです。 sort のアルゴリズムによりますが、基本的にイテレータは「ソート前と同じ要素」を指しています。 (ANo.1 の例であれば、イテレータ it が指す要素はソート前もソート後も3のままであり、 ソート前は先頭から2番目の要素を指すイテレータだったのが、ソート後は先頭から4番目の要素を指すイテレータになっている。)
お礼
解凍ありがとうございました
- Yanch
- ベストアンサー率50% (114/225)
listにデータ操作を加えた後は、それ以前に取得したイテレータの動作は保証 されないと思います。 例えば、ソートや、データの追加、削除を行った場合。
お礼
解凍ありがとうございました
お礼
解凍ありがとうございました