Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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何时重新分配其内存阵列?_C++_Stl_Vector - Fatal编程技术网

C++ std::vector何时重新分配其内存阵列?

C++ std::vector何时重新分配其内存阵列?,c++,stl,vector,C++,Stl,Vector,我找不到任何确切的答案。我只是好奇std::vector是否只在它绝对必须或将要提前重新分配内部数组时才重新分配它的内部数组(可以这么说) 例如: std::vector<int> myVector; for (int i = 0; i < 1000; ++i) myVector.push_back(i); cout << myVector.size() << '\n' // Gives 1000 as expected <&

我找不到任何确切的答案。我只是好奇std::vector是否只在它绝对必须或将要提前重新分配内部数组时才重新分配它的内部数组(可以这么说)

例如:

std::vector<int> myVector;
for (int i = 0; i < 1000; ++i) myVector.push_back(i);

cout << myVector.size() << '\n'      // Gives 1000 as expected
     << myVector.capacity() << endl; // Gives 1024 which makes sense
std::vector myVector;
对于(int i=0;i<1000;++i)myVector.push_back(i);

cout如果您查看有关push_back on it的文档,则说明:

这有效地增加了矢量 大小为1,这会导致 内部分配资源的重新分配 如果向量大小相等,则存储 到之前的向量容量 呼叫重新分配使所有 以前获得的迭代器, 引用和指针

所以我非常怀疑在那之前尺寸会改变,但是你可以随时测试它。至少在我的平台上,尺寸变化如上所述:

size vs capacity
1020 vs 1024
1021 vs 1024
1022 vs 1024
1023 vs 1024
1024 vs 1024
1025 vs 2048
发件人:

但是向量也有一个容量,它决定了它们所分配的存储空间的大小,这个容量可以等于或大于实际大小。分配的额外存储量不会被使用,而是为向量保留,以便在其增长时使用。这样,向量就不必在每次增长时重新分配存储空间,而只需在耗尽额外空间并插入新元素时(这只应以与其大小相关的对数频率发生)


vector会根据需要重新分配自己,增加容量——即当超过当前容量时(当
size()==capacity()


增加多少容量取决于实施情况:通常
新容量=旧容量*系数
,其中
系数
介于1.5到2之间(理论理想值等于)。这样做是为了将新的元素推回到向量中,将使时间常数变为常数。

< P>从C++标准23.2.4.2:

size_type capacity() const;
返回:向量在不需要重新分配的情况下可以保留的元素总数

也来自标准

注意:重新分配会使引用中元素的所有引用、指针和迭代器无效 序列保证在调用后发生的插入期间不会发生重新分配 保留()直到插入使向量的大小大于 在最近对reserve()的调用中指定

所以,是的,你可以肯定


编辑:正如@bopersson提到的,有一个陷阱。如果我们从不调用
reserve()
,标准不会说任何话。然而在实践中,它工作得很好,因为没有任何实现会关心是否调用了reserve。我相信这是错误。正如@Martin在C++0x草稿中的回答中所提到的,它被更正了。

标准保证调用不会使迭代器无效。从技术上讲,
std::vector
只需进行不需要将数据复制到新位置(即不会使迭代器无效)的大小调整,即可符合标准。不过,我怀疑是否有人这样做

因此,在调用
reserve()
resize()
或任何其他记录为无效迭代器的调用时,会发生调整大小的操作。

声明

内存将被重新分配 如果超过容量() -size()元素被插入到向量中。重新分配不起作用 更改大小(),也不会更改 向量的任何元素的值。 但是,它确实增加了容量(), 它使[5]任何迭代器无效 那个点指向向量


我发现这些笔记很有用:

(为什么向量在执行重新分配时会将其存储扩展两倍?)


但是,这是SGI STL,找不到g++文档。

来自标准:n3092:Draft C++0x

23.3.6.2矢量容量[矢量容量]

空位保留(尺寸\类型n)
2效果:一个指令,通知向量计划的大小更改,以便它可以相应地管理存储分配。在reserve()之后,如果发生再分配,则capacity()大于或等于reserve的参数;否则等于容量()的上一个值当且仅当当前容量小于reserve()的参数时,此时才会发生重新分配。。如果异常不是由非CopyConstructible类型的move构造函数引发的,则不会产生任何影响

23.3.6.4向量修饰符[向量修饰符]
备注:如果新容量大于旧容量,则会导致重新分配。如果没有重新分配,则插入点之前的所有迭代器和引用都保持有效。如果异常不是由T的复制构造函数、移动构造函数、赋值运算符或移动赋值运算符或任何InputIterator操作引发的,则不会产生任何影响。如果非CopyConstructible T的move构造函数引发异常,则未指定效果


+1为了在几乎相同的目的下加快速度(我可能应该注意顶部的小橙色条…),我自己进行了测试,对问题进行了编辑,以获得更多的澄清(并使用“重新分配”而不是“调整大小”)。运行测试永远不会给出“确定的答案”,除非人们只对特定编译器的特定版本感兴趣。你需要参考标准。CPLUS PLUS是不是标准。@马克:但它就像维基百科的C++,代码>漂亮的DIN精确的< /COD>(TM)@马克:我确实检查了标准,它基本上包含了关于向量插入的相同的引用。你的标题有点误导,因为“Resisig”意思是“改变大小”;答案是无论何时插入或删除元素。你的意思是:它什么时候改变容量?而且你确实是有保证的:除非绝对需要。(您可以调用
reserve()
,以便