最近、本を読んでいるときに偶然詳細を発見しました。それは、vector の消去操作です。この消去操作には 2 つの形式があることは誰もが知っています。(1) 単一の要素を削除します。パラメーターは反復変数です。(2) 間隔要素を削除します。パラメーターは begin と end です。詳細は、単一の要素が削除されたときに発生する具体的な内容です。
例: このように初期化されたベクトルがあります。vector
通常、コードは次のように書かれます:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); for (auto i = va.begin();i != va.end(); i++) { if (*i == 4) { i = va.erase(i); } } for (auto i : va) { std::cout << i << " "; } return 0; }
一見何も問題はありませんが、結果は予想外です
なぜこのような結果になるのでしょうか?よく考えてみると、if 条件が成立すると、ベクトルは削除操作を実行し、条件を満たすベクトル内の要素を削除するのがポイントです。消去操作を実行すると、戻り値は現在削除されているイテレータの次の位置を表します。その後、ループが再度繰り返されると、イテレータは 1 つ後ろに移動し、同じ要素は存在しません。削除されました。
正しいスペルを添付します:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); auto iter = vb.begin(); while(iter!=vb.end()) { if (iter != vb.end()) { if (*iter == 4) { iter = vb.erase(iter); } else { iter++; } } } for (auto j : vb) { std::cout << j << " "; } return 0; }
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; for (auto i = va.begin();i != va.end(); ) { if (*i == 4) { i = va.erase(i); } else { i++; } } for (auto i : va) { std::cout << i << " "; } return 0; }