我正在为我的vector成员变量预先分配一些内存.下面的代码是最小的部分
class A {
vector<string> t_Names;
public:
A () : t_Names(1000) {}
};
Run Code Online (Sandbox Code Playgroud)
现在在某个时间点,如果t_Names.size()等于1000.我打算增加规模100.然后如果它到达1100,再增加100等等.
我的问题是,在vector::resize()和之间做出选择vector::reserve().在这种情况下还有更好的选择吗?
编辑:我有一些精确的估计t_Names.我估计它要700到了800.然而,在某些(很少)情况下,它可以增长超过1000.
Jan*_*dec 243
这两个功能完全不同!
的resize()方法(和传递参数的构造等同于)将插入或删除元素的适当数量的矢量,从而使它给定的大小(它必须指定它们的值可选的第二个参数).它会影响size(),迭代将遍历所有那些元素,push_back将在它们之后插入并且你可以使用它直接访问它们operator[].
该reserve()方法仅分配内存,但保留未初始化.它只影响capacity(),但size()不会改变.对象没有值,因为向量中没有添加任何内容.如果然后插入元素,则不会重新分配,因为它是事先完成的,但这是唯一的效果.
所以这取决于你想要什么.如果您想要一个包含1000个默认项的数组,请使用resize().如果您想要一个阵列,您希望插入1000个项目,并希望避免一些分配,请使用reserve().
编辑: Blastfurnace的评论让我再次阅读这个问题并意识到,在您的情况下,正确的答案是不要手动预分配.只需根据需要在元素末端插入元素即可.向量将根据需要自动重新分配,并且比上述手动方式更有效.唯一reserve()有意义的情况是,您需要提前轻松获得所需总尺寸的合理精确估计.
EDIT2:广告问题编辑:如果您有初步估算,那么reserve()估算.如果事实证明还不够,那就让矢量做吧.
Naw*_*waz 27
resize()不仅分配内存,它还创建与您传递给参数的所需大小一样多的实例resize().但是reserve()只分配内存,它不会创建实例.那是,
std::vector<int> v1;
v1.resize(1000); //allocation + instance creation
cout <<(v1.size() == 1000)<< endl; //prints 1
cout <<(v1.capacity()==1000)<< endl; //prints 1
std::vector<int> v2;
v2.reserve(1000); //only allocation
cout <<(v2.size() == 1000)<< endl; //prints 0
cout <<(v2.capacity()==1000)<< endl; //prints 1
Run Code Online (Sandbox Code Playgroud)
输出(在线演示):
1
1
0
1
Run Code Online (Sandbox Code Playgroud)
resize()如果您不想要默认创建的对象,那么可能并不可取.它也会很慢.此外,如果您有push_back()新元素,则通过分配新内存(这也意味着将现有元素移动到新分配的内存空间)size()将进一步增加向量.如果你在开始时已经使用过来确保已经有足够的已分配内存,那么当你使用它时,向量会增加,但是在它为你保留的空间用完之前它不会再分配新的内存.reserve()size()push_back()