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();
}