繁体   English   中英

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

[英]Is `std::vector<primitive>::clear()` a constant time operation?

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

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

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

从如何实现vector的 POV 考虑这一点。 当你调用:

 delete [] internalPtr;

发生什么了?

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

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

在这个链接中:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM