2012-03-23 44 views
5

我想清除一些std::list的內容。去除元素的順序對我來說很重要。根據以下測試程序的輸出,順序是從第一個到最後一個元素。它保證是如此嗎?從C++ 2003標準來看,我並不清楚。清除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

只是出於好奇:爲什麼刪除命令對你很重要? – nietaki 2012-03-23 14:24:15

+4

如果這對你來說很重要,你可以使用erase()手動一個接一個地擦除它們。 – 2012-03-23 14:25:35

+4

@GabrielSchreiber:...或者'pop_front()'。 – kennytm 2012-03-23 14:26:46

回答

8

不,它沒有定義,你不應該依賴於它。

3

不,它沒有定義。

唯一標準specifys,只要您撥打a.clear()它將被解析爲a.erase(q1,q2),它只是指定年代擦除會刪除範圍[q1,q2)的所有元素,但它不指定將在其中做這樣的順序。

0

在C++ 03標準:

表67序要求(除了容器) ...

a.clear()

斷言/注:無效擦除(開始(),結束())

交:尺寸()== 0

由於它開始從「開始」刪除元素,我認爲可以安全地推斷它們將按順序刪除。否則將是隨機訪問列表元素的性能損失。

+0

我不認爲這是一個安全的假設,因爲擦除(q1,q2)沒有提到任何有關元素被破壞的順序。 – juanchopanza 2012-03-23 14:49:37

2

只是爲了完整性,C++ 11標準並不確定任何sequence containers的銷燬順序,其中std::list是其成員。它只聲明所有元素都被銷燬,所有引用元素的指針,指針和迭代器都是無效的,並且結束迭代器可能會使無效。關於clear(),它不提及erase(),begin()end(),這與hte C++ 03標準不同。

相關問題