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

C++ 如何设置std::vector的初始大小?,c++,stl,C++,Stl,我有一个向量,我在向量中放了很多项,我需要快速访问,所以我不使用列表。如何设置向量的初始大小(例如,设置为20000个位置,以便在插入新向量时避免复制)?您需要使用reserve函数设置初始分配大小,或者在初始构造函数中进行设置 vector<CustomClass *> content(20000); 载体含量(20000); 或 矢量内容; ... 储量(20000); 当您reserve()元素时,向量将为(至少?)那么多元素分配足够的空间。这些元素不存在于向量中,但内存

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

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

vector<CustomClass *> content(20000);
载体含量(20000);

矢量内容;
...
储量(20000);
当您
reserve()
元素时,
向量将为(至少?)那么多元素分配足够的空间。这些元素不存在于
向量中,但内存已准备好使用。因为内存已经分配,所以这可能会加速
push_back()

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

std::vector whatever;
不管怎样,储备金(20000);
前者设置数组的实际大小,即使其成为20000个指针的向量。后者使向量为空,但为20000个指针保留了空间,因此您可以插入(最多)那么多指针,而无需重新分配


至少在我的经验中,这两种方法中的任何一种都会在性能上产生巨大的差异,这是相当罕见的——但在某些情况下,这两种方法都会影响正确性。特别是,只要不进行重新分配,向量中的迭代器就保证保持有效,一旦设置了大小/保留空间,您可以保证,只要不增加超出此范围的大小,就不会进行任何重新分配。

在任何
std::vector
引用中都有一个构造函数和两个函数,这取决于哪个更适合您的需要。您无法避免复制,只需设置初始值。是否避免复制?就复制成本而言,存储指针是相当轻量级的。类似:@Damir,你的意思是标题中的
std::vector
?对于大量插入/删除,哪种方法更有效?@Loggie:我怀疑效率会有任何差异。大多数情况下,它会改变您使用它的方式——对于前者,您只需寻址指针,因此类似于
which[10000]=somepointer
,后者要求您将添加的每个指针向后推。至少如果您习惯了
向量
,后者可能更简单、更自然。如果要从中复制的容器的大小已知,为什么不更有效地(重新)调整大小,然后再复制,而不是将其推后?@Cincinnatus:因为它调用了
reserve
,从而预先分配内存大小。从理论上讲,设置大小的速度可能会更快,因为它还可以避免每次添加项目时增加当前大小。事实上,我怀疑你是否能够衡量这一点。事实上,如果你在热路径上执行此操作,并且代码被大量调用,那么你可以进行大量指令和节省时间。在构造过程中,也可以通过传递整型参数来分配大小(例如,
std::vector content(100);
)@kstruct:Yes,但它的效率可能会降低——只需很小的数量。
std::vector<CustomClass *> whatever(20000);
std::vector<CustomClass *> whatever;
whatever.reserve(20000);