vector的 resize()和reserve()的区别

为了支持快速随机访问,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是否大于capacityreserve()函数与capacity相关,调用reserve(n)之后,如果容器当前capacity<n,则重新分配内存空间,使capacity=n;如果capacity>=n,capacity不发生变化。

因此我们可以看出来,reserve是容器预留空间,同时并没有创建元素,在创建元素之前不能引用容器内的元素;resize是改变容器大小,并且创建对象,因此当调用该函数后,就可以通过operator[]或者迭代器来引用容器内的元素。

猜你喜欢

转载自blog.csdn.net/qqkb1016/article/details/81214110
今日推荐