`std :: vector <primitive> :: clear()`是一个恒定时间操作?</primitive>

时间:2013-02-20 00:41:28

标签: c++ vector stl clear

在向量上调用clear()将调用存储在向量中的任何内容的析构函数,这是一个线性时间操作。但是,当向量包含intdouble

等基本类型时,情况就是这种情况

4 个答案:

答案 0 :(得分:4)

我认为答案取决于实施。最多需要 线性时间,但有些实现可能会选择对此进行优化。

Per Does clearing a vector affect its capacity?',即使调用.clear,MSVC和G ++都不会降低其向量的容量。查看G ++头文件,很明显.clear是默认分配器的常量时间,只要元素是标量(原始算术类型或指针)。

答案 1 :(得分:2)

从POV中考虑如何实现vector。当您调用时:

 delete [] internalPtr;

会发生什么?

  • 堆必须回收连续的空间块
  • 析构函数必须在internalPtr
  • 中触发或每个对象

对于原始类型,前者仍然必须发生,但对于它们不存在析构函数。所以delete[]将完全基于堆可以删除内存块的速度来执行

答案 2 :(得分:0)

在此链接中:

http://www.cplusplus.com/reference/vector/vector/clear/

它表示clear()的复杂性在大小上是线性的(破坏)。

答案 3 :(得分:0)

嗯..它说clear()是线性的,但我们也知道它调用每个项目的析构函数......

http://www.cplusplus.com/reference/vector/vector/clear/

如果析构函数调用不是线性的,该怎么办?

但是,对于原语,析构函数调用是线性的(或者是常量,除非它不是线性的,否则这并不重要)

所以是的,在原语上是明确的()总是线性操作