Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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++ 将n个元素推到向量上的空间复杂性_C++_Algorithm_Vector - Fatal编程技术网

C++ 将n个元素推到向量上的空间复杂性

C++ 将n个元素推到向量上的空间复杂性,c++,algorithm,vector,C++,Algorithm,Vector,假设输入大小为n,这n个元素被推到一个向量上 我最近开始学习空间复杂性,但我有点困惑。所以它关注内存使用情况,但这是动态分配的内存 vector<int> v; 向量v; 虽然这不使用“new”关键字,但我读到,当你推送时,向量实际上是动态分配的,那么这是否意味着空间复杂度仅仅是O(n) 是的,std::vector的空间复杂度在其size()中是线性的(或者实际上是其容量())。请注意,虽然可以静态或动态分配std::vector对象本身,但其数据内容始终是动态分配的。(正如

假设输入大小为n,这n个元素被推到一个向量上

我最近开始学习空间复杂性,但我有点困惑。所以它关注内存使用情况,但这是动态分配的内存

vector<int> v; 
向量v;
虽然这不使用“new”关键字,但我读到,当你推送时,向量实际上是动态分配的,那么这是否意味着空间复杂度仅仅是O(n)

是的,
std::vector
的空间复杂度在其
size()
中是线性的(或者实际上是其
容量()
)。请注意,虽然可以静态或动态分配
std::vector
对象本身,但其数据内容始终是动态分配的。(正如@DyP在评论中指出的,分配的实际方式取决于您为向量使用的分配器。但是默认分配器使用动态分配)。

std::vector的空间复杂度在其大小上是线性的,因为底层结构是C-array

然而,当你申报

std::vector<int> v;
std::vector v;
构建了一个空容器。如果发生再分配,再分配本身在整个规模上是线性的


如果您事先知道数组的大小,则可以使用,以避免每次使用
push_back()
插入元素时(隐式)重新分配向量v声明vector类型的对象v,而不传递任何构造函数参数。这意味着它调用默认构造函数(),该构造函数分配一个0大小的向量。它可能在内部调用
newint[0]
(这是一个有效的
调用)。此外,如果您知道将有n个元素,则最好(而不是按)以大小n开始向量(调整大小,或使用单参数构造函数),并将元素放入向量中,就像向量是
int[]
array.@leewangzhong大小为零的向量并不意味着容量为0的向量。IIRC,该实现可以为默认的ctor创建一个大于0的容量。我的观点是,即使您没有从任何元素开始,它也可能调用new。当使用默认分配器时,“它的数据内容将始终是动态分配的”。