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
e vai elemento por elemento. No4
, Quero remover elementos1
,4
e9
então não podemos usar um loop normal aqui.