从std :: list清除元素的顺序是什么?

时间:2012-03-23 14:19:11

标签: c++ list stl

我想清除一些std::list的内容。删除元素的顺序对我来说很重要。根据以下测试程序的输出,顺序是从第一个到最后一个元素。是否保证如此?我不清楚C ++ 2003标准。

#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

4 个答案:

答案 0 :(得分:8)

不,它没有定义,你不应该依赖它。

答案 1 :(得分:3)

不是没有定义。

标准仅指定每当您致电a.clear()时,它将被解析为a.erase(q1,q2)并且仅指定擦除将擦除范围[q1,q2)中的所有元素,但它未指定它会这样做的顺序。

答案 2 :(得分:2)

为了完整起见,C ++ 11标准不确定任何sequence containers的破坏顺序,其中std::list是其成员。它只声明所有元素都被销毁,引用元素的所有引用,指针和迭代器都是无效的,并且过去的结束迭代器可能无效。关于clear(),与hte C ++ 03标准不同,它没有提及erase()begin()end()

答案 3 :(得分:0)

来自c ++ 03标准:

  

表67-序列要求(除容器外)   ......

     

a.clear()

     

断言/注意:void erase(begin(),end())

     

发布:size()== 0。

由于它开始从“开始”删除元素,我认为可以安全地推断它们将按顺序删除。否则将对随机访问列表元素造成性能损失。