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