11

调用clear()向量将调用存储在向量中的任何内容的析构函数,这是一个线性时间操作。但是当向量包含像intor这样的原始类型时,情况是否如此double

4

4 回答 4

5

我相信答案取决于实现。它最多需要线性时间,但一些实现可能会选择优化这一点。

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

于 2013-02-20T00:58:03.633 回答
2

从可能如何实施的 POV 考虑这一点vector。当您调用时:

 delete [] internalPtr;

怎么了?

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

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

于 2013-02-20T00:45:37.297 回答
0

在这个链接中:

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

它说复杂性的clear()大小是线性的(破坏)。

于 2013-02-20T00:52:05.810 回答
0

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

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

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

然而,在原语上,析构函数调用是线性的(或常数,这并不重要,除非它不超过线性)

所以是的,在原语上是 clear() 总是一个线性运算

于 2013-02-20T00:59:18.360 回答