私のコードで最も頻繁に発生するエラーの 1 つは、ループ中に STL コンテナーが変更されることです。
ループの実行中に要素が削除または追加されるため、通常、境界外の例外が発生します。
私の for ループは通常次のようになります。
for (auto& Item : Items) { // Will not work when Items container is modified
//... loop logic
}
複数のアイテムを削除できる場合、私はこの怪物を使用します。
for (int Index=Items.size()-1;Index<=0;Index--) {
if (Index<Items.size()) { //Because multiple items can be removed in a single loop
//... loop logic
}
}
これは見栄えが悪く、2番目のオプションを使用すると気分が悪くなります。複数のアイテムを削除できる理由は、1 つのイベントで任意の数の要素を削除できるイベントによるものです。
これがいつ発生するかを示す擬似コードを次に示します。
// for each button in vector<button> {
// process button events
// event adds more buttons to vector<button>
// *ERROR* vector<button> is modified during loop.
// }
別の例として、次の項目を持つベクトルを想像してください。
// 0 1 2 3 4 5 6 7 8 9
ループを開始し、0
要素ごとに進みます。では、 elementsを削除し4
たいので、ここでは通常のループを使用できません。1
4
9