Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是'std::vector<;原语>;::clear()`一个固定时间操作?_C++_Vector_Stl - Fatal编程技术网

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)