2012-07-05 8 views
10

Me pregunto cuál es la razón detrás de hacer std::list<>::splice para invalidar los iteradores que se refieren a la subsecuencia que se empalma en el nuevo contenedor. Esto me parece un poco ilógico, especialmente a la luz de la especificación estándar std::container::swap. De acuerdo con el estándar de lenguaje std::container::swap no invalida ningún iterador. Esta es una especificación práctica perfectamente razonable. Sin embargo, yo diría que std::list<>::splice también se beneficiaría en gran medida del comportamiento de conservación de iteradores.std :: list <> :: splice invalida iteradores. ¿Razón fundamental?

entiendo que puede haber algunas consideraciones puramente académicas basadas en los conceptos de accesibilidad iterador, etc. Pero, al mismo tiempo splice es una operación específica de std::list, lo que significa que proporciona una especificación hecho a medida de que probablemente no causar un daño conceptual serio al diseño de STL en general.

¿Qué era? ¿Proscribiría o complicaría en exceso algunas implementaciones prácticas de std::list, que no reconozco?

+0

posible duplicado de [empalme() en std :: list e invalidación de iterador] (http://stackoverflow.com/questions/143156/splice-on-stdlist-and-iterator-invalidation) – jwismar

Respuesta

7

En C++ 11 splice no invalida los iteradores, pero los hace referirse a los elementos apropiados en el contenedor *this. Todo esto se describe en 23.3.5.5.

+0

Oh, OK. Acabo de encontrar eso. Entonces, aparentemente no había una buena razón para el requisito de invalidación. Mi pregunta surge principalmente después de ver cuántos aros y bucles tiene que pasar Microsoft en su implementación de STL para proporcionar compatibilidad con "depuración de iteradores" tanto para 'swap' como' splice'. Gracias por la respuesta. – AnT

+0

@AndreyT "_So, aparentemente no había una buena razón para el requisito de invalidación." "Realmente no. En algún momento, el comité quería apoyar completamente asignadores de memoria _unequal_, y estos asignadores no son compatibles, por lo que sería necesario realizar algunas copias en este caso tan especial. – curiousguy

4

Si los contenedores se han personalizado, desiguales (no compatibles) asignadores, no puede cambiar los punteros, no tiene más remedio que copiar elementos realmente.

Cuestiones relacionadas