example c++ vector iterator

c++ - example - Vector de iteradores<o!=



vector c++ (3)

Hace la diferencia, aunque no para std::vector . Todos los iteradores son equivalentes a la igualdad, entonces != Siempre funcionará. Solo los iteradores de acceso aleatorio son menos que comparables, como es std::vector , por lo que en su caso no sería un gran problema.

¿Alguien podría ayudarme a entender si hay una gran diferencia en != Y < cuando se trata de hablar de vectores iteradores dentro de un ciclo for ?

Quiero decir, no importa si usas != Y < , el resultado debería ser el mismo?

for (vector<int>::iterator i = vec.begin(); i != vec.end(); i++) // DO STUFF

for (vector<int>::iterator i = vec.begin(); i < vec.end(); i++) // DO STUFF

Soy consciente de que la forma más común es usar != , Pero < sería un gran problema si se utilizara?


Toda la filosofía detrás de la parte STL de la Biblioteca Estándar (los contenedores, iteradores y algoritmos) es minimizar las distinciones programáticas entre los contenedores. Exhiben diferentes propiedades, pero la forma en que las programa está diseñada para ser lo más similar posible.

Esto hace que sean más fáciles de aprender y más fáciles de usar genéricamente . Eso significa que puede escribir una función genérica (o algoritmo) y hacer que se aplique a cualquier otro contenedor (o tantos como sea posible).

Con esto en mente, es beneficioso usar la sintaxis que es común a todos los contenedores e iteradores donde sea posible .

Solo los iteradores de algunos contenedores permiten < comparaciones pero todos los iteradores de los contenedores aceptan != . Por esa razón, recomendaría usar siempre != Como una cuestión de consistencia y para facilitar que su código se transfiera fácilmente a un contenedor diferente.


operator< solo se admite para iteradores de acceso aleatorio . std::vector::iterator es un iterador de acceso aleatorio, por lo tanto i != vec.end() y i < vec.end() son compatibles y válidos y no hacen ninguna diferencia en su ejemplo.

Si tuviera un contenedor que no admite iteradores de acceso aleatorio (por ejemplo, std::list ), i < list.end() no se compilaría.

La recomendación general es utilizar el incremento de postfix solo cuando sea necesario, porque puede crear una copia innecesaria cuando el iterador no es trivial, por lo que ++i es más limpio y puede ser más rápido.

Además, si el bucle llama a una función cuya definición no está disponible en esta unidad de traducción, vec.end() se vec.end() a cargar desde la memoria en cada iteración de bucle, lo que podría causar una falta de memoria caché innecesaria. Puede evitar esa recarga guardando el valor en una variable local, de modo que el compilador esté seguro de que la variable local es inaccesible para cualquier otra función:

for(vector<int>::iterator i = vec.begin(), j = vec.end(); i < j; ++i) // ...

Aún mejor, es posible que desee utilizar bucles range-for que eviten estos riesgos de rendimiento para usted:

for(auto const& elem : vec) // ...