如果我有std::vector
一个原始类型,并且我调用clear()
(这种方式push_back
从 的开头开始capacity
),clear()
调用将在恒定时间还是线性时间内完成?文档说它会破坏所有元素,但如果元素是 int,则不应该有任何东西可以破坏,对吧?
编辑:我找到了一个副本,其中有一张海报,他详细解释了实现可以检查析构函数是否微不足道,并给出了一个具有该检查的编译器的示例(GCC)。
如果我有std::vector
一个原始类型,并且我调用clear()
(这种方式push_back
从 的开头开始capacity
),clear()
调用将在恒定时间还是线性时间内完成?文档说它会破坏所有元素,但如果元素是 int,则不应该有任何东西可以破坏,对吧?
编辑:我找到了一个副本,其中有一张海报,他详细解释了实现可以检查析构函数是否微不足道,并给出了一个具有该检查的编译器的示例(GCC)。
这取决于向量是如何实现的,但是具有简单析构函数的对象数组(包括诸如内置整数类型的 POD int
)应该能够通过一次调用安全地释放,vector<T>::allocator_type::deallocate
而无需循环元素并单独调用析构函数。std::vector
可以使用或编译器内部的实现type_traits
来确定是否T
有一个普通的析构函数,并相应地释放内部数组。您需要检查您的实现的源代码以了解它的作用,但大多数主流实现std::vector
将为您提供具有琐碎析构函数的类型的常量时间释放(或至少对于整数类型和其他 POD 的常量时间)。
该标准不保证std::vector::clear
.