example - list push c++
splice() en std:: list e invalidación de iterador (3)
La forma de 3 argumentos de list::splice()
mueve un solo elemento de una lista a la otra. La documentación de SGI establece explícitamente que todos los iteradores, incluido el que apunta al elemento que se está moviendo, siguen siendo válidos. La documentación de Roguewave no dice nada sobre las propiedades de invalidación de los iteradores de los métodos de splice()
, mientras que el estándar de C ++ establece explícitamente que invalida todos los iteradores y las referencias al elemento que se empalma.
splicing () en la práctica funciona como lo define SGI, pero obtengo una falla de aserción (desreferenciación del iterador no válido) en las versiones depug / secure SCL de la implementación STL de microsoft (que sigue estrictamente la letra del estándar).
Ahora, estoy usando la lista exactamente porque quiero mover un elemento entre listas, conservando la validez del iterador que apunta a él. El estándar ha hecho un cambio extremadamente inútil a la especificación original de SGI.
¿Cómo puedo solucionar este problema? ¿O debería ser simplemente pragmático y meter la cabeza en la arena (porque el empalme no invalida los iteradores en la práctica, ni siquiera en la implementación del MS, una vez que la depuración del iterador está desactivada).
El problema es que si el iterador aún apunta al elemento que se movió, entonces el iterador "final" asociado previamente con el iterador "movido" ha cambiado. A menos que escriba algún ciclo complejo, esto es realmente algo malo, especialmente porque será más difícil de entender para otros desarrolladores.
Una mejor manera en mi opinión es usar los iteradores que apuntan a los elementos antes y después del iterador movido.
Tengo una matriz de listas (clases de equivalencia de elementos) y estoy usando empalme para mover elementos entre las listas. Tengo una matriz adicional de iteradores que me da acceso directo a cualquier elemento en cualquiera de las listas y moverlo a otra lista. Ninguna de las listas se busca y modifica al mismo tiempo. Podría reiniciar el elemento iterador después del empalme, pero es un poco feo ... Supongo que lo haré por el momento.