Pregunta

for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

¿La condición de "stlVector.size ()" parte terminación tomar "stlVector.erase (...)" ¿en consideración? En otras palabras no stlVector.size () de actualización para cada iteración del bucle? No puedo probarlo ahora mismo, así que he publicado una pregunta aquí.

Thx por adelantado!

Saludos,

zhengtonic

¿Fue útil?

Solución

Para que quede claro, no pensar en ello en términos del bucle refrescante nada. Cada vez que se comprueba la condición (al comienzo de cada vez a través del bucle), el método size () se llama en la variable stlVector, y se devuelve el tamaño actual del vector.

El borrado () método reduce el tamaño del vector, por lo que el tamaño de la próxima vez () se llama, el valor devuelto será más pequeño.

Otros consejos

Sí lo hace!

stlVector.size () // is called for evey iteration

Así, para cada lazo que tendrá la prueba "i

Sí, se realiza el examen, con efectos secundarios, para cada bucle.

A para bucle es simplemente una convención agradable - un bucle for se descompone fácilmente como un bucle while:

for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

Se convierte en:

int i = 0 ;

while(i < stlVector.size())
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
    i++;
}

-Adán

Sí, lo hace, pero no hagas esto! Si desea eliminar los elementos de un vector, hacerlo dentro de otro bucle. Se dispone a eliminar los elementos después de que el índice i en este caso: nada garantiza que exista la stlVector [i + 5] elemento. Si se quita el elemento i-ésimo del vector, el recuento se rompe porque se puede saltar los elementos sin comprobar ellos.

La forma más segura de hacer esto es el almacenamiento de referencias para los elementos de la stlVector que desee eliminar en otro vector, y luego iterar sobre este vector auxiliar haciendo stlVector.erase (auxVector [i]).

espero que el código que ha proporcionado no es sólo "código de fantasía" (como un comentarista decía) para dar un ejemplo concreto del tipo de cosas que estamos tratando de hacer.

Sin embargo en caso de que no lo es: el bucle que diste saltará sobre el elemento 12 (es decir, el elemento originalmente en stlVector[11]) debido al examinar stlVector[10] se elimina un elemento anterior, haciendo que todos los elementos posteriores a derivación hacia adelante una posición, pero todavía se incrementas i al final del bucle. Así que la próxima iteración se verá en stlVector[11] que en realidad es el elemento que estaba originalmente en stlVector[12]. Para remediar esto, es necesario --i después de la llamada a erase().

Siempre reevaluar seguro!

Además, para aclarar un poco, ya que lo preguntas si se hace de esta manera "en VC ++ 6".

El "continuar condición" se vuelva a evaluar en cada bucle en todas las versiones de C, C ++, C # y Java.

Si algún compilador no genera código que hace eso, se rompe, y debe evitarse.

Como otros han dicho, sí la condición se vuelve a evaluar en cada iteración del bucle. Es por eso que una optimización del rendimiento común es:

int saveSize = someExpensiveComputation();

for (int i = 0 ; i < saveSize ; i++)
{ 
    foo(i);
}

donde el bucle condicional es caro en absoluto para calcular, en lugar de

for (int i = 0 ; i < someExpensiveComputation(); i++)
{ 
    foo(i);
}

Cuando el cálculo caro se hace innecesariamente cada iteración a través del bucle.

Si se reduce el tamaño. Más información está aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top