std::矢量元素的销毁顺序
Order of destruction of elements of an std::vector
可能重复:
STL容器元件销毁订单
有没有保证std::vector
的元素从最后到第一都会被破坏?
2003:5.3.5/6关于delete[]
:
delete表达式将调用要删除的对象或数组元素的析构函数(如果有的话)。在数组的情况下,元素将按照地址递减的顺序被销毁(即,按照其构造函数完成的相反顺序;见12.6.2)
因此,如果您的std::vector
对象的分配器使用delete[]
,那么,是的,它必然会以相反的顺序销毁元素。
然而,不能保证你的std::vector
会以这种方式工作(事实上,它很可能不会),而且我找不到任何特定于容器的引用。
实际上,我认为这一切都取决于您的分配器,2003:20.1.5(列出了对分配器的要求)似乎没有说明任何问题
否,对数组有保证,其中所有元素都是按顺序构建并按相反顺序销毁的。这与全局对象的处理方式有些一致。
另一方面,容器成员可以使用例如insert
和erase
成员函数以任何顺序构造和销毁。为了在某种程度上保持一致并以相反的构建顺序销毁元素,这将需要容器对这些更改保持某种日志记录。显然这会很贵!
最好的选择是容器析构函数调用clear()
,它被定义为erase(begin(), end())
,但我也找不到任何要求。该标准仅在表65中说明了"线性复杂性"。
他们的标准为原始数组保证了这一点,但我找不到任何能为容器保证这一点的东西。
来自[expr.delete]
(C++0x的新措辞):
如果删除表达式的操作数值不是空指针值,则删除表达式将调用要删除的对象或数组元素的析构函数(如果有的话)。在数组中,元素将按地址递减的顺序(即按完成的相反顺序)销毁建造商;见12.6.2)。
std::vector
(事实上,标准库中的所有容器,可能不包括std::array
)不使用delete[]
来销毁元素(它们在每个元素上单独使用allocator_traits<allocator_type>::destroy
),因此上述保证不适用。我在std::vector
或容器上找不到关于删除顺序的任何限制。对于某些容器,这样的保证将非常昂贵(例如,std::forward_list
不能反向迭代元素来删除它们,std::map
不记得添加对的顺序)。
来自[container.requirements.general]
(C++0x措辞):
对于本子条款中声明分配器类型的组件,存储在组件应使用allocator_traits::construct函数和使用allocator_traits::destroy函数销毁(20.6.8.2)。
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 序列容器 - 只能按顺序访问元素
- 如何检查 2 个 c++ 数组在 O(1) 或 O(log n) 时间复杂度中是否相同(所有元素都相同,顺序很重要)?
- 保留从一个多集复制到另一个多集的元素的顺序
- 如何在 C++ 中将从文本文件中读取的元素推送和弹出到数组中,并按 Revserse 顺序输出堆栈?
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 编写一个递归功能,该功能采用数组并以相反顺序显示元素,而无需在末尾启动数组的索引
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- stable_sort不遵守元素的顺序
- 从容器中获取随机元素,该容器在恒定时间内没有严格的元素顺序
- 如何在默认和二维数组中找到顺序扩大元素的位置
- 多重映射是否保证广告顺序与其初始值设定项中给出的元素顺序匹配
- 调用std::nth_element后第n个元素之前的元素顺序
- 控制地图中元素的顺序
- 指针集中元素的顺序
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- 双向循环列表中的赋值运算符以错误的顺序添加元素
- 更改STL多集中两个相等元素的顺序
- 初始值设定项列表中元素的求值顺序