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

use*_*792 11 c++ stl vector clear

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

nne*_*neo 5

我相信答案取决于实现。它最多需要线性时间,但某些实现可能会选择对此进行优化。

Per '清除向量是否会影响其容量?',即使在.clear被调用时,MSVC 和 G++ 都不会降低其向量的容量。查看 G++ 头文件,很明显,.clear只要元素是标量(原始算术类型或指针),默认分配器就是常量时间。


Dou*_* T. 2

从 a 可能如何实施的角度来思考这一点vector。当您调用时:

 delete [] internalPtr;
Run Code Online (Sandbox Code Playgroud)

会发生什么?

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

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

  • 至少使用默认分配器,`std::vector`不会使用`delete []internalPtr;`。 (6认同)