小编典典

在 vector::resize() 和 vector::reserve() 之间选择

all

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.


阅读 78

收藏
2022-07-29

共1个答案

小编典典

这两个函数做的事情截然不同!

resize()方法(并将参数传递给构造函数等效于该方法)将向向量插入或删除适当数量的元素以使其具有给定大小(它具有可选的第二个参数来指定它们的值)。它将影响size(),迭代将遍历所有这些元素,
push_back 将在它们之后插入,您可以使用operator[].

reserve()方法仅分配内存,但未初始化。它只影响capacity(),但size()不会改变。对象没有任何价值,因为向量中没有添加任何内容。如果然后插入元素,则不会发生重新分配,因为它是提前完成的,但这是唯一的效果。

所以这取决于你想要什么。如果您想要一个包含 1000 个默认项的数组,请使用resize(). 如果您想要一个希望插入 1000
个项目的数组并希望避免多次分配,请使用reserve().

编辑: Blastfurnace 的评论让我再次阅读了这个问题并意识到,在你的情况下,正确的答案是 不要
手动预分配。只需根据需要在末尾插入元素即可。向量将根据需要自动重新分配,并且比提到的手动方式 更有效。
唯一reserve()有意义的情况是,当您对所需的总大小有相当精确的估计时,您需要提前轻松获得。

EDIT2: 广告问题编辑:如果您有初步估计,那么reserve()估计。如果事实证明这还不够,就让向量来做这件事。

2022-07-29