Iterando através de contêineres STL e removendo / adicionando vários itens

Um dos erros mais freqüentes que ocorrem no meu código é que os contêineres do STL são modificados durante um loop.

Elementos são removidos ou adicionados durante a execução de um loop, então eu geralmente corro para exceções fora dos limites.

Meus loops for geralmente se parece com isso:

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

Quando vários itens podem ser removidos, eu uso essa monstruosidade:

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

Isso parece ruim e me faz sentir mal usando essa segunda opção. A razão pela qual vários itens podem ser removidos é devido a eventos, em que um único evento pode remover qualquer número de elementos.

Aqui está algum código pseudo para ilustrar quando isso ocorre:

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

Em outro exemplo, imagine um vetor com os seguintes itens:

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

Nós começamos nosso loop em0&nbsp;e vai elemento por elemento. No4, Quero remover elementos1,4&nbsp;e9&nbsp;então não podemos usar um loop normal aqui.