回答ベクトルを自己コピーする方法は?イテレータの無効化について少し混乱しました。一部の文献には、「insert、push_backなどを使用する場合は、すべてのイテレータを無効と見なす」と記載されています。それは明らかです、それはイテレータを無効にするベクトルを成長させるかもしれません。十分なスペースがあることがわかっている特別な場合はどうですか?
初挑戦:
myvec.reserve(myvec.size()*3); //does this protect me from iterator invalidation?
vector<string>::iterator it = myvec.end();
myvec.insert(myvec.end(), myvec.begin(), it);
myvec.insert(myvec.end(), myvec.begin(), it);
いくつかの優れた回答の後、2回目の試行:
auto size = myvec.size();
myvec.reserve(size*3); //does this protect me from iterator invalidation?
myvec.insert(myvec.end(), myvec.begin(), myvec.begin()+size);
myvec.insert(myvec.end(), myvec.begin(), myvec.begin()+size);
より優れた回答の後、3回目の試行:
auto size = myvec.size();
myvec.reserve(size*3); //does this protect me from iterator invalidation?
back_insert_iterator< vector<string> > back_it (myvec);
copy (myvec.begin(),myvec.begin()+size,back_it);
copy (myvec.begin(),myvec.begin()+size,back_it);
Josuttisの「C++標準ライブラリリファレンス」からのこの引用:
要素を挿入または削除すると、次の要素を参照する参照、ポインター、およびイテレーターが無効になります。挿入によって再割り当てが発生すると、すべての参照、イテレータ、およびポインタが無効になります。
私のコードが安全で定義された動作であることを示唆しています。これを保証する基準に一節はありますか?