2012-03-23 9 views
5

Quiero borrar el contenido de algunos std::list. El orden de eliminación de elementos es importante para mí. Según el resultado del siguiente programa de prueba, el orden es del primer al último elemento. ¿Se garantiza que sea así? No estaba claro para mí desde el estándar C++ 2003.¿Cuál es el orden de los elementos de limpieza de std :: list?

#include <list> 
#include <iostream> 

struct A 
{ 
    A(int i) : I(i) {} 
    ~A() { std::cout << I << std::endl; } 
    int I; 
}; 

int main() 
{ 
    std::list<A> l; 
    l.push_back(A(1)); 
    l.push_back(A(2)); 
    l.push_back(A(3)); 

    std::cout << "clearing list" << std::endl; 
    l.clear(); 
} 

ideone link

+3

Solo por curiosidad: ¿por qué la orden de eliminación es importante para usted? – nietaki

+4

Si es tan importante para usted, puede usar borrar() para borrarlos uno después del otro manualmente. –

+4

@GabrielSchreiber: ... o 'pop_front()'. – kennytm

Respuesta

8

No, no es definido, y no se debe confiar en él.

3

No, no está definido.

La norma única specifys que cada vez que se llama a a.clear() se resolverá como a.erase(q1,q2) y que sólo se especifica es el borrado borrará todos los elementos en el rango [q1,q2) pero no especifica el orden en que lo hará.

0

De C++ 03 estándar:

Tabla 67 requisitos de secuencia (además de contenedor) ...

a.clear()

afirmación/nota: void borrar (begin(), el extremo())

mensaje: size() == 0.

Dado que comienza a eliminar elementos de "comenzar", creo que es seguro infiere que se eliminarán en orden. De lo contrario, se penalizará el rendimiento de los elementos de la lista de acceso aleatorio.

+0

No creo que sea una suposición segura, ya que erase (q1, q2) no dice nada sobre el orden de destrucción de los elementos. – juanchopanza

2

Para completar, el estándar C++ 11 no determina el orden de destrucción de ningún sequence containers, del cual std::list es miembro. Solo indica que todos los elementos se destruyen, todas las referencias, punteros e iteradores que hacen referencia a los elementos se invalidan, y el pasado el iterador final puede ser invalidado. Con respecto a clear(), no hace mención de erase(), begin() o end(), a diferencia del estándar hte C++ 03.

Cuestiones relacionadas