verificar usar qué pueden para métodos hay elementos cplusplus contenedores contenedor clase c++ stl iterator

usar - map c++



¿Cuál es el mal uso común de usar contenedores STL con iteradores? (9)

¿Cuál es el mal uso común de usar contenedores STL con iteradores?


Algunos otros:

  • Convirtiendo un iterador inverso a un iterador base sin recordar que el iterador ahora será un elemento más allá del que estaba apuntando.

  • Intenta usar algoritmos que requieren un iterador de acceso aleatorio con iteradores de elementos como conjuntos y mapas.

  • Edición de la clave de una entrada de mapa con un iterador no const (esto ocurre al construir en VS.Net, pero no con GCC)


La verificación del rango final debe estar utilizando! = Y no <, ya que no se garantiza el orden de los punteros.

Ejemplo:

for(it = list.begin(); it != list.end(); ++it) { // do stuff }


Olvidar que los iteradores a menudo se invalidan si cambia el contenedor insertando o borrando miembros del contenedor.

Para obtener muchos consejos útiles sobre el uso de STL, recomiendo encarecidamente el libro de Scott Meyers "Effective STL" ( enlace esterilizado de Amazon ).


Post-incremento cuando el pre-incremento hará.


Usando un auto_ptr dentro de un contenedor, por ejemplo

list<auto_ptr<int> > foo;

Afortunadamente, muchas implementaciones auto_ptr en estos días están escritas para hacer esto imposible.


Utilizándolos sin leer el libro "Effective STL" de Scott Meyers. :) De Verdad. Esto hace que la mayoría de los bichos estúpidos desaparezcan.


Correcta continuación después de erase() .

Asumiendo:

Container::iterator i = cont.begin(), iEnd = cont.end();

Por ejemplo en std::map , esta no es una buena idea:

for (; i != iEnd; ++i) { if (i->second.eraseCondition()) { cont.erase(i); } }

Esto funcionaría:

for (; i != iEnd; ) { Container::iterator temp = i; ++temp; if (i->second.eraseCondition()) { cont.erase(i); } i = temp; }

Y esto también:

for (; i != iEnd; ) { if (i->second.eraseCondition()) { cont.erase(i++); } else { ++i; } }

Ha sido muchas veces realmente que he tenido que aplicar estas correcciones en algún código de producción :(


list<int> l1, l2; // ... for_each(l1.begin(), l2.end(), do_it());


Esto no es solo un problema con los contenedores STL: el contenedor modyfing cuando se itera sobre él casi siempre genera problemas.

Esta es una fuente muy común de errores en los juegos: la mayoría de los bucles de juego consisten en iterar sobre cada objeto del juego haciendo algo. Si esto algo agrega o borra elementos del contenedor de objetos del juego, seguramente habrá errores.

Solución: tenga dos contenedores, objectsToDelete y objectsToAdd, en el código del juego, agregue objetos a esos contenedores y actualice el contenedor de objetos del juego solo después de iterar sobre él.

objetsToAdd se puede establecer para garantizar que no eliminaremos nada más de una vez.

objectsToDelete puede ser Queue si puedes construir Object sin agregarlo al contenedor de objetos del juego, o puede ser alguna otra clase (ObjectCreateCommand?) si tu código asume que la instancia Object siempre se agrega al contenedor de objetos del juego directamente después de la creación (por ejemplo, en constructor )