2012-03-23 12 views
5

Chcę wyczyścić zawartość niektórych std::list. Kolejność usuwania elementów jest dla mnie ważna. Zgodnie z danymi wyjściowymi z poniższego programu testowego, kolejność jest od pierwszego do ostatniego elementu. Czy to gwarantuje? Nie było to dla mnie jasne ze standardu C++ 2003.Jaka jest kolejność usuwania elementów ze 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

Po prostu z ciekawości: dlaczego kolejność usuwania jest dla Ciebie ważna? – nietaki

+4

Jeśli jest to dla Ciebie ważne, możesz użyć funkcji kasowania(), aby usunąć je kolejno jeden po drugim. –

+4

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

Odpowiedz

8

Nie, to nie jest zdefiniowane, i nie należy na niej polegać.

3

Nie jest niezdefiniowany.

Standardowa specifys tylko, że kiedy zadzwonić a.clear() zostanie on rozwiązany jako a.erase(q1,q2) i to wystarczy określić to erase spowoduje usunięcie wszystkich elementów w zakresie [q1,q2) ale nie precyzuje, w jakiej kolejności będzie to zrobić.

0

z C++ 03 standardzie:

Tabela wymagania 67-Sequence (oprócz pojemnika) ...

a.clear()

twierdzenie/uwaga: void wymazać (begin(), end())

postu: wielkość() == 0.

Ponieważ zaczyna usuwanie elementów z "rozpocznij", myślę, że można bezpiecznie stwierdzić, że zostaną one usunięte w kolejności. W przeciwnym razie zostanie nałożona kara za wydajność na elementach listy dostępu losowego.

+0

Nie sądzę, że jest to bezpieczne założenie, ponieważ kasowanie (q1, q2) nie mówi nic o kolejności niszczenia elementów. – juanchopanza

2

Tylko dla kompletności, standard C++ 11 nie określa kolejność zniszczenia żadnego sequence containers, którego członkiem jest std::list. Stwierdza jedynie, że wszystkie elementy są niszczone, wszystkie odniesienia, wskaźniki i iteratory odnoszące się do elementów są unieważniane, a ostatni iterator końcowy może zostać unieważniony. Odnośnie do clear(), nie wspomina o erase(), begin() lub end(), w przeciwieństwie do standardu hte C++ 03.

Powiązane problemy