我正在为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有某种精确的估计。我估计它在700800附近。但是,在某些(很少)情况下,它的增长可能超过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/

10-09 03:20