私が見つけたいくつかのSTLドキュメントによると、std :: listに要素を挿入または削除しても、イテレータは無効になりません。これは、リスト(frombegin()
からend()
)をループしてから、push_frontを使用して要素を追加できることを意味します。
たとえば、次のコードでは、要素a、b、cを使用してリストを初期化し、それをループして要素のpush_frontを実行します。結果はcbaabcになるはずです。これは、まさに私が得たものです。
std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");
for (std::list<std::string>::iterator itList = testList.begin(); itList != testList.end(); ++itList)
testList.push_front(*itList);
for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
std::cout << *itList << std::endl;
逆イテレータ(からrbegin()
へのループrend()
)を使用してpush_backを使用すると、同様の動作、つまりabccbaの結果が期待されます。ただし、別の結果が得られます。
std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");
for (std::list<std::string>::reverse_iterator itList = testList.rbegin(); itList != testList.rend(); ++itList)
testList.push_back(*itList);
for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
std::cout << *itList << std::endl;
結果はではありませんabccba
が、abcccba
です。そうです、追加されたcが1つあります。
最初のpush_backも、rbegin()で初期化されたイテレータの値を変更するようです。push_backの後、リストの3番目の要素(以前は最後の要素でした)ではなく、4番目の要素(現在は最後の要素)を指します。
Visual Studio 2010とGCCの両方でこれをテストしたところ、どちらも同じ結果を返しました。
これはエラーですか?または、私が気付いていない逆イテレータの奇妙な動作ですか?