libreria iterador español ejemplo c++ templates iterator containers invalidate

iterador - stl c++ español



Cuando la estructura de datos es un parámetro de plantilla, ¿cómo puedo saber si una operación invalidará un iterador? (3)

Específicamente, tengo una clase que actualmente usa un vector y push_back. Hay un elemento dentro del vector del que quiero hacer un seguimiento. Retroceder en el vector puede invalidar el iterador, por lo que mantengo su índice. Es barato encontrar el iterador nuevamente usando el índice. No puedo reservar el vector ya que no sé cuántos elementos se insertarán.

Consideré hacer que la estructura de datos sea un parámetro de plantilla, y tal vez la lista se pueda usar en su lugar. En ese caso, encontrar un iterador del índice no es una operación trivial. Debido a que retroceder en una lista no invalida los iteradores a los elementos existentes, podría simplemente almacenar este iterador en su lugar.

Pero, ¿cómo puedo codificar una clase genérica que maneje ambos casos fácilmente?

Si puedo averiguar si push_back invalidará el iterador, podría almacenar el iterador y actualizarlo después de cada push_back almacenando la distancia desde el comienzo antes de la operación.


Probablemente deberías tratar de evitar esta flexibilidad. Cita del ítem 2 " Cuidado con la ilusión del código independiente del contenedor " de Effective STL por Scott Meyers:

Enfrenta la verdad: no vale la pena. Los diferentes contenedores son diferentes y tienen fortalezas y debilidades que varían de manera significativa. No están diseñados para ser intercambiables, y no hay nada que puedas hacer con el papel. Si lo intentas, simplemente estás tentando al destino, y al destino no le gusta ser tentado.

Si realmente, positivamente, definitivamente tiene que mantener iteradores válidos, use std::list . Si también necesita tener acceso aleatorio, intente con Boost.MultiIndex (aunque perderá acceso contiguo a la memoria).

Si observa los adaptadores de contenedor estándar ( std::stack , std::queue ), verá que admiten la intersección de las interfaces de contenedores adaptables, no su unión .


Si realmente desea seguir con el vector y tener esa funcionalidad, tal vez eche un vistazo a
http://en.cppreference.com/w/cpp/container/vector/capacity function. envuelva sus push_backs en una función definida o incluso mejor envuelva whole std :: vector en su clase y antes de que push_backing compare la capacidad con el tamaño () para verificar si el cambio de tamaño ocurrirá.


Crearía una segunda clase, cuya responsabilidad sería devolver el iterador que le interese. También se debe parametrizar con el mismo parámetro de plantilla, y luego se puede especializar para el tipo que desee (vector / list, etc.). Entonces, dentro de sus especializaciones puede usar cualquier método que desee.

Entonces es una solución basada en rasgos.