Iterando a través de contenedores STL y eliminando / agregando múltiples elementos
Uno de los errores más frecuentes que se producen en mi código es que los contenedores STL se modifican durante un ciclo.
Los elementos se eliminan o se agregan durante una ejecución de bucle, por lo que generalmente me encuentro con excepciones fuera de límites.
Mis bucles for usualmente se ven así:
for (auto& Item : Items) { // Will not work when Items container is modified
//... loop logic
}
Cuando se pueden eliminar varios elementos, uso esta monstruosidad:
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
}
}
Esto se ve mal y me hace sentir mal usar esa segunda opción. La razón por la que se pueden eliminar varios elementos se debe a eventos, donde un solo evento puede eliminar cualquier número de elementos.
Aquí hay un pseudo código para ilustrar cuando esto ocurre:
// for each button in vector<button> {
// process button events
// event adds more buttons to vector<button>
// *ERROR* vector<button> is modified during loop.
// }
En otro ejemplo, imagine un vector con los siguientes elementos:
// 0 1 2 3 4 5 6 7 8 9
Comenzamos nuestro bucle en0
y vaya elemento por elemento. A4
, Quiero eliminar elementos1
,4
y9
así que no podemos usar un bucle normal aquí.