调用clear()
向量将调用存储在向量中的任何内容的析构函数,这是一个线性时间操作。但是当向量包含像int
or这样的原始类型时,情况是否如此double
?
问问题
688 次
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
于 2013-02-20T00:52:05.810 回答
0
好吧..它说 clear() 是线性的,但我们也知道它调用每个项目的析构函数...
http://www.cplusplus.com/reference/vector/vector/clear/
如果析构函数调用不是线性的怎么办?
然而,在原语上,析构函数调用是线性的(或常数,这并不重要,除非它不超过线性)
所以是的,在原语上是 clear() 总是一个线性运算
于 2013-02-20T00:59:18.360 回答