std::vector:<int>:clear, constant time?

std::vector<int>::clear, constant time?

本文关键字:constant time clear int vector lt std gt      更新时间:2023-10-16

可能重复:
std::vector<的复杂性是什么;T>:clear((当T是基元类型时?

如果我有一个具有基元类型的std::vector,并且我调用clear()(这样push_backcapacity的开头开始(,那么clear()调用将在恒定时间还是线性时间内完成?文档说它会销毁所有元素,但如果元素是int,就不应该有任何东西要销毁,对吧?


编辑:我发现了一个副本,上面有一个海报,详细解释了实现可以检查析构函数是否微不足道,并给出了一个有这种检查的编译器(GCC(的例子。

std::vector<的复杂性是什么;T>:clear((当T是基元类型时?

这取决于向量的实现方式,但具有琐碎析构函数的对象数组(包括像int这样的内置整数类型的POD(应该能够通过对vector<T>::allocator_type::deallocate的单个调用来安全地释放,而无需在元素上循环并单独调用析构函数。std::vector的实现可以使用type_traits或编译器内部来确定T是否具有平凡的析构函数,并相应地解除分配内部数组。您需要检查实现的源代码,以了解它的作用,但std::vector的大多数主流实现将为具有琐碎析构函数的类型提供恒定时间的释放(或者至少为整型和其他POD提供恒定时间(。

标准并不能保证std::vector::clear的复杂性,尽管对于复杂的元素类型,操作在容器大小上是线性的,而对于POD,操作是常量。