2012-03-23 73 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标准不同。

相关问题