Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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++向量构造函数是否有效?_C++_Vector_Constructor - Fatal编程技术网

C++向量构造函数是否有效?

C++向量构造函数是否有效?,c++,vector,constructor,C++,Vector,Constructor,如果我做一个像这样的向量: vector<int>(50000000, 0); gVec = vector<int>(); gVec.reserve(50000000); // push_back default values gVec = vector<int>(); gVec.reserve(50000000); // push_back default values 内部发生了什么?它是否会生成一个默认向量,然后不断添加值,并根据需要调整大小

如果我做一个像这样的向量:

vector<int>(50000000, 0); 
gVec = vector<int>(); 
gVec.reserve(50000000);
// push_back default values
gVec = vector<int>(); 
gVec.reserve(50000000);
// push_back default values
内部发生了什么?它是否会生成一个默认向量,然后不断添加值,并根据需要调整大小?注意:50000000在编译时是未知的

如果我这样做向量会有不同吗:

vector<int>(50000000, 0); 
gVec = vector<int>(); 
gVec.reserve(50000000);
// push_back default values
gVec = vector<int>(); 
gVec.reserve(50000000);
// push_back default values
请告诉我构造函数知道如何避免在给定这两个参数的情况下进行不必要的重新分配

如果我这样做向量会有不同吗:

vector<int>(50000000, 0); 
gVec = vector<int>(); 
gVec.reserve(50000000);
// push_back default values
gVec = vector<int>(); 
gVec.reserve(50000000);
// push_back default values
reserve单独分配存储。不执行初始化。应用于空向量时,它将导致对所用分配器的allocate member函数的一次调用

所示的构造函数分配所需的存储并将每个元素初始化为零:它在语义上等同于一个reserve和一行push_-back


在这两种情况下都不会进行重新分配。

通过在调试器中单步执行这两个选项,您将大大增强从这个问题中学到的知识-如果您能够从头脑中过滤掉许多最初令人困惑的模板和内存分配抽象,那么了解std::vector源代码的功能应该会很有帮助。为自己解开这个谜团——STL只是其他人的代码,我的大部分工作时间都花在浏览上面

vector保证连续存储,因此只为元素分配一个内存块。如果向量控制结构基于堆而不是基于RAII堆栈,那么它将需要第二次分配

向量,0

创建容量>=N且大小为N的向量,其中N个值分别设置为0

逐步:

gVec=向量

创建一个空向量,通常具有标称“最佳猜测”容量

gVec.reserveN

更新向量的容量-确保向量至少有N个元素的空间。通常,这涉及从“最佳猜测”默认容量进行重新分配,该容量不太可能大到足以满足本问题中提出的N值

//推回默认值


这里的每次迭代都会将向量的大小增加1,并将向量的新back元素设置为0。向量的容量不会改变,直到推送的值的数量超过N加上向量实现可能应用的任何pad(通常为零)。

我认为,理论上,构造函数可以从分配一小块内存开始,并在返回之前扩展几次,至少对于副本构造函数中没有副作用的类型。这是允许的,只是因为这样做没有明显的副作用,而不是因为标准做了任何事情来直接允许它


至少在我看来,不值得花时间或精力去担心这种可能性。至少可以说,有人这样做的机会似乎很渺茫。它只被允许到本质上不可能真正禁止的程度。

设计标准库的人非常聪明,如果设计具有多个分配的向量向量向量机,那将是一种耻辱;所以答案是否定的,它分配在一个go@vsoftco-矢量元素连续存储是标准的一部分。@SteveTownsend正确,但是,您仍然可以分步执行:新建内存、删除内存、新建2*内存等,这完全没有意义。我喜欢您提到的大小和容量之间的差异,虽然我觉得与这个问题没有直接关系,但我也觉得对于初学者来说,理解向量类是以大小和容量实现的这个问题是非常有帮助的。我还发现关于“最佳猜测”容量的部分很有趣。然而,从前面的问题中,我了解到,根据标准,reserve只需要通知向量大小的变化,而不必执行任何分配,直到可能添加了一个元素。谢谢你抽出时间。