我想清除一些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();
}
答案 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。
由于它开始从“开始”删除元素,我认为可以安全地推断它们将按顺序删除。否则将对随机访问列表元素造成性能损失。