次のコードは期待どおりに動作します (テストはパスします) が、この方法で反復子を操作することは C++ では悪い習慣と見なされるのか、それとも問題ないのか疑問に思います。
おそらくこれは特定のものでstd::vector
あり、他のコレクションの動作は異なり、ベストプラクティスはコレクション (またはそれらの実装) 間で異なりますか?
他の言語では確かに問題があり、ほとんどの場合、コレクションを変更するとイテレータが無効になり、例外がスローされます。
BOOST_AUTO_TEST_CASE (ReverseIteratorExample) {
std::vector<int> myvector;
for(int i = 0; i < 5; i++)
{
myvector.push_back(i);
}
// is this generally a bad idea to change the vector while iterating?
// is it okay in this specific case?
myvector.reserve(myvector.size() + myvector.size() - 2 );
myvector.insert(myvector.end(), myvector.rbegin() + 1, myvector.rend() -1);
int resultset [8] = { 0,1,2,3,4,3,2,1 };
std::vector<int> resultVector( resultset, resultset + sizeof(resultset)/sizeof(resultset[0]) );
BOOST_CHECK_EQUAL_COLLECTIONS(myvector.begin(), myvector.end(), resultVector.begin(), resultVector.end());
}
まとめられた質問:
- これは、反復中にベクトルを変更するのは一般的に悪い考えですか?
- この特定のケースで大丈夫ですか?
- これは特定のコレクションで
std::vector
あり、他のコレクションの動作は異なりますか? - ベスト プラクティスはコレクション (またはその実装) によって異なりますか?