Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从std::list中清除元素的顺序是什么?_C++_List_Stl - Fatal编程技术网

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

C++ 从std::list中清除元素的顺序是什么?,c++,list,stl,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

我想清除一些
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();
}
#包括
#包括
结构A
{
A(int i):i(i){}

~A(){std::cout不,它没有定义,您不应该依赖它。

不,它没有定义

该标准仅规定,无论何时调用
a.clear()
,它都将解析为
a.erase(q1,q2)
,它只指定了擦除将擦除范围
[q1,q2)
中的所有元素,但它没有指定执行此操作的顺序。

来自c++03标准:

表67顺序要求(除集装箱外)

a、 清除()

断言/注意:无效擦除(开始(),结束())

post:size()==0


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

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

只是出于好奇:为什么删除顺序对您很重要?如果删除顺序对您很重要,您可以使用erase()手动逐个删除。@GabrielSchreiber:…或
pop_front()
@nietaki:顺序很重要,因为有些对象使用引用,而其他对象会使引用无效。首先,我必须删除使用引用的对象,然后删除那些无效的对象。我希望会定义顺序,因为它是序列容器。似乎保存顺序的最佳可靠方法是使用
pop_front()
。我认为这不是一个安全的假设,因为erase(q1,q2)没有说明元素的破坏顺序。
#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();
}