我正在为vector
成员变量预分配一些内存。下面的代码是最小的一部分
class A {
vector<string> t_Names;
public:
A () : t_Names(1000) {}
};
现在在某个时间点,如果
t_Names.size()
等于1000
。我打算将大小增加100
。然后,如果达到1100
,请再次增加100
,依此类推。我的问题是,在
vector::resize()
和vector::reserve()
之间选择什么。在这种情况下还有更好的选择吗?编辑:我对
t_Names
有某种精确的估计。我估计它在700
到800
附近。但是,在某些(很少)情况下,它的增长可能超过1000
。 最佳答案
这两个功能做的事情大不相同!resize()
方法(传递给构造函数的参数与此等效)将向向量插入或删除适当数量的元素,以使其具有给定的大小(它具有可选的第二个参数来指定其值)。它将影响size()
,迭代将遍历所有这些元素,push_back将在它们之后插入,您可以使用operator[]
直接访问它们。reserve()
方法仅分配内存,但未初始化。它仅影响capacity()
,但size()
将保持不变。这些对象没有任何价值,因为没有添加任何向量。如果您随后插入元素,则不会发生重新分配,因为它是预先完成的,但这是唯一的效果。
因此,这取决于您想要什么。如果要包含1000个默认项目的数组,请使用resize()
。如果要向其插入1000个项目的数组,并且希望避免分配两次,请使用reserve()
。
编辑:高炉的评论使我再次阅读了该问题,并意识到,在您的情况下,正确的答案是不手动进行预分配。只需根据需要在最后插入元素。矢量将根据需要自动重新分配,并且比上述手动方式更有效。 reserve()
唯一有意义的情况是,当您对总大小有合理精确的估计时,您将需要提前轻松获得。
EDIT2:广告问题编辑:如果您有初始估算,请reserve()
该估算。如果结果还不够,那就让向量做它的事情。
关于c++ - 在vector::resize()和vector::reserve()之间选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41360608/