如何设置std :: vector的初始大小?


130

我有个vector<CustomClass*>向量,我在向量中放入了很多项目,我需要快速访问,所以我不使用列表。如何设置向量的初始大小(例如为20 000个位,所以在插入新的向量时避免复制)?


1
在任何std::vector参考文献中都有一个构造函数和两个函数,具体取决于您的需求。
克里斯,2012年

1
您无法避免仅设置初始值就进行复制。
juanchopanza 2012年

1
避免复制?就复制成本而言,存储指针非常轻巧。
user7116


1
@Damir,您的意思std::vector是标题吗?
罗伯(Robᵩ)2012年

Answers:


180
std::vector<CustomClass *> whatever(20000);

要么:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

前者设置数组的实际大小,即使其成为20000指针的向量。后者将向量留空,但保留了20000个指针的空间,因此您可以插入(最多)多个指针,而不必重新分配。

至少以我的经验来看,这两种方式在性能上产生巨大差异是很不寻常的-但在某些情况下,两者都会影响正确性。特别是,只要不发生任何重新分配,就可以保证向量中的迭代器保持有效,并且一旦设置了大小/保留空间,就可以保证只要您不进行任何重新分配,不能增加尺寸。


对于大量插入/删除操作,哪种方法更有效?
ctor 2012年

3
@Loggie:我怀疑效率会有所不同。大多数情况下,它会改变您的使用方式-使用前者,您只需寻址指针,所以类似whatever[10000] = somepointer;,其中后者要求push_back您添加的每个指针。至少如果您习惯了vector,后者可能会更简单,更自然。
杰里·科芬

如果知道要复制的容器的大小,为什么(重新)调整大小然后复制而不是push_back更有效?

1
@Cincinnatus:因为它有一个对的调用reserve,它会预先分配内存大小。从理论上讲,设置大小可能仍会更快,因为这还避免了每次添加项目时增加当前大小。实际上,我怀疑您是否可以衡量这一点。
杰里·科芬

1
实际上,如果您在热路径上执行此操作,并且代码被调用很多,则可以节省大量指令和时间。
bayindirh 2014年

15

您需要使用reserve函数来设置初始分配的大小,或者在初始构造函数中执行。

vector<CustomClass *> content(20000);

要么

vector<CustomClass *> content;
...
content.reserve(20000);

当您使用reserve()元素时,vector将会为(至少?)足够多的元素分配足够的空间。中的元素不存在vector,但是可以使用内存了。然后可能会加快速度,push_back()因为已经分配了内存。


分配的大小也可通过在一个积分参数传递(例如在施工期间提供std::vector<Custom Class*> content(100);
adelbertc

@kstruct:是的,但是效率可能较低-数量很少。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.