可能重复:
What is the complexity of std::vector<T>::clear() when T is a primitive type?
如果我有std::vector
原始类型,并且我调用clear()
(这种方式push_back
从capacity
的开头开始),则是{{ 1}}呼叫将在恒定时间或线性时间内完成?文档说它会破坏所有元素,但是如果元素是一个int,那么就不应该有任何东西可以销毁,对吗?
编辑: 我找到了一个副本,其中有一张海报,详细解释了实现可以检查析构函数是否微不足道,并给出了一个具有该检查(GCC)的编译器的示例。
What is the complexity of std::vector<T>::clear() when T is a primitive type?
答案 0 :(得分:3)
这取决于向量的实现方式,但是一个具有普通析构函数的对象数组(包括内置整数类型的POD,如int
)应该能够通过一次调用安全地释放出来。 vector<T>::allocator_type::deallocate
没有循环遍历元素并单独调用析构函数。 std::vector
的实现可以使用type_traits
或编译器内部来确定T
是否具有普通的析构函数,并相应地释放内部数组。您需要检查实现的源代码以了解它的作用,但std::vector
的大多数主流实现将为具有简单析构函数的类型提供常量时间释放(或者至少为整数类型保留时间)和其他POD)。
答案 1 :(得分:2)
该标准不保证std::vector::clear
的复杂性,尽管您希望操作在复杂元素类型的容器大小中是线性的,而对于POD则是常量。