Iterieren durch STL-Container und Entfernen / Hinzufügen mehrerer Elemente

Einer der häufigsten Fehler, die in meinem Code auftreten, ist, dass STL-Container während einer Schleife geändert werden.

Elemente werden während einer Schleifenausführung entfernt oder hinzugefügt, sodass ich normalerweise auf Ausnahmen stoße, die außerhalb der Grenzen liegen.

Meine for-Schleifen sehen normalerweise so aus:

for (auto& Item : Items) { // Will not work when Items container is modified
    //... loop logic
}

Wenn mehrere Gegenstände entfernt werden können, benutze ich diese Monstrosität:

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
    }
}

Das sieht schlecht aus und ich fühle mich schlecht, wenn ich diese zweite Option benutze. Der Grund, warum mehrere Elemente entfernt werden können, liegt an Ereignissen, bei denen ein einzelnes Ereignis eine beliebige Anzahl von Elementen entfernen kann.

Hier ist ein Pseudocode, um dies zu veranschaulichen:

// for each button in vector<button> {
// process button events
// event adds more buttons to vector<button>
// *ERROR* vector<button> is modified during loop.
// }

Stellen Sie sich in einem anderen Beispiel einen Vektor mit folgenden Elementen vor:

// 0 1 2 3 4 5 6 7 8 9

Wir beginnen unsere Runde um0 und gehen Element für Element. Beim4Ich möchte Elemente entfernen1,4 und9 Wir können hier also keine normale Schleife verwenden.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage