vector的 resize()和reserve()的区别
程序员文章站
2022-03-01 22:17:45
...
为了支持快速随机访问,vector将元素连续存储——每个元素紧挨着前一个元素存储。
关于vector对象是如何改变容器大小?
resize(n)
调整容器元素个数为n,如果n小于容器的原size,则删除多余的元素,否则必须添加新元素并且初始化。
resize(n,t)
调整容器元素个数为n,并且同时初始化为t。
注:若果resize缩小容器,则指向被删除元素的迭代器,引用和指针都会失效;
同时提供了关于容器容量的成员函数
reserve(n)
分配至少能容纳n个元素的内存空间
注:reserve并不改变容器中元素的数量,它仅影响vector预先分配多大的内存空间
同时,理解size和capacity的区别非常重要
size:是指容器已经保存的元素的个数
capacity:是指容器与分配的存储空间的大小
以下代码表示size和capacity的区别
vector<int>v;
cout << "v1:size:" << v.size()
<< "capacity:" << v.capacity() << endl;
for (vector<int>::size_type i = 0; i != 10; ++i)
{
v.push_back(i);
}
cout << "v1:size:" << v.size()
<< "capacity:" << v.capacity() << endl;
由运行结果可知,初始化的vector的size和capacity都为0,当插入元素后,元素个数与size相同,capacity基本大于元素个数。
我们调整代码如下:
vector<int>v;
cout << "v1:size:" << v.size()
<< "capacity:" << v.capacity() << endl;
for (vector<int>::size_type i = 0; i != 10; ++i)
{
v.push_back(i);
}
cout << "v1:size:" << v.size()
<< "capacity:" << v.capacity() << endl;
v.resize(7);
v.reserve(24);
cout << "v1:size:" << v.size()
<< "capacity:" << v.capacity() << endl;
运行结果:
由运行结果我们可知
resize()函数与size相关,调用resize(n)之后,容器的size就为n,至于同时是否影响capacity,取决于调整后的容器size是否大于capacity。
reserve()函数与capacity相关,调用reserve(n)之后,如果容器当前capacity<n,则重新分配内存空间,使capacity=n;如果capacity>=n,capacity不发生变化。
因此我们可以看出来,reserve是容器预留空间,同时并没有创建元素,在创建元素之前不能引用容器内的元素;resize是改变容器大小,并且创建对象,因此当调用该函数后,就可以通过operator[]或者迭代器来引用容器内的元素。
上一篇: Matplotlib之扇形图绘制