C++ 是'std::vector<;原语>;::clear()`一个固定时间操作?
对向量调用C++ 是'std::vector<;原语>;::clear()`一个固定时间操作?,c++,vector,stl,C++,Vector,Stl,对向量调用clear()将调用向量中存储的任何内容的析构函数,这是一个线性时间操作。但是,当向量包含诸如int或double之类的基本类型时,是否会出现这种情况?从向量如何实现的角度考虑这一点。当您调用: delete [] internalPtr; 会发生什么 堆必须回收连续的空间块 析构函数必须对internalPtr中的每个对象进行激发或删除 对于基元类型,前者仍然必须发生,但它们不存在析构函数。因此,delete[]将完全根据堆删除此链接中内存块的速度执行: 它说clear()
clear()
将调用向量中存储的任何内容的析构函数,这是一个线性时间操作。但是,当向量包含诸如int
或double
之类的基本类型时,是否会出现这种情况?从向量如何实现的角度考虑这一点。当您调用:
delete [] internalPtr;
会发生什么
- 堆必须回收连续的空间块
- 析构函数必须对internalPtr中的每个对象进行激发或删除
对于基元类型,前者仍然必须发生,但它们不存在析构函数。因此,delete[]
将完全根据堆删除此链接中内存块的速度执行:
它说clear()
的复杂性在大小上是线性的(破坏)。我相信答案取决于实现。它最多需要线性时间,但有些实现可能会选择对此进行优化
根据“”,MSVC和G++都不会降低其向量的容量,即使调用了.clear
。查看G++头,很明显,.clear
是默认分配器的常数时间,只要元素是标量(基本算术类型或指针)。。。它说clear()是线性的,但我们也知道它调用每个项的析构函数
如果析构函数调用ist不是线性的呢
但是,在原语上,析构函数调用是线性的(或常量,除非它不超过线性,否则这并不重要)
所以是的,在原语上是clear()始终是一个线性操作至少使用默认分配器,std::vector
不会使用delete[]internalPtr代码>。我在C++11标准中找不到任何东西来支持这一点。链接可能是错误的。它在哪里说它是线性的?我在C++11标准中的任何地方都找不到它,但我可能遗漏了一些东西。OP特别询问了原语,这些原语具有琐碎的析构函数。@juanchopanza和Nneono Fixed这似乎与我在标准中找不到任何关于vector::clear()
(或序列容器的clear())的事实一致。当然,这可能是因为我没有正确地搜索…@juanchopanza:我已经查看了规范,而且看起来确实如此。但是,请注意,erase(begin(),end())
指定的时间等于调用每个析构函数所需的时间。可能重复的可能重复的可能重复的可能重复的O(0)
?