STL的vector::resize() 和 vector::reserve()区别和作用详解

一、概述

现在数组基本都用vector了,很方便,但可能对vector的某些属性还不是很了解。以前只是大概知道reserve和resize是分别干什么的,但是并不了解它们的真正目的是什么,今天仔细回顾了一下,终于弄懂了,现在做个记录。

二、区别和作用

1. resize() 设置有效空间,reserve() 设置总体容量

通俗点说,假如蔡徐坤要开演唱会,地点定在了A体育馆,这个体育馆可容纳 5000 5000 5000人。在演唱会开始前卖票,发现销量不是很好,只卖出去了大概 300 300 300张票,但为了保险起见(避免溢出),在体育馆内放置了500把椅子。从这个例子来看,体育馆的 5000 5000 5000人容量是一开始蔡徐坤用 r e s e r v e ( ) reserve() reserve() 申请的 5000 5000 5000人总容量,放置的 500 500 500把椅子,是他用 r e s i z e ( ) resize() resize() 申请的 500 500 500人有效空间。

这里的 5000 5000 5000对应着 v e c t o r : : c a p a c i t y ( ) vector::capacity() vector::capacity(),而 500 500 500对应着 v e c t o r : : s i z e ( ) vector::size() vector::size()

用代码来看看是不是这样

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> concert;
    concert.reserve(5000);
    concert.resize(500);
    cout << "capacity: " << concert.capacity() << endl;
    cout << "size: " << concert.size() << endl;
}

在这里插入图片描述
后来,蔡徐坤换到了一个大气球里面开演唱会,这个打气球可以尽可能大的膨胀。蔡徐坤一开始只 r e s e r v e ( ) reserve() reserve() 500 500 500人的容量, r e s i z e ( ) resize() resize() 300 300 300个座位,但是发现大家很喜欢这个气球,进来了更多的人,最后一共进来了 800 800 800人,于是他又 r e s i z e ( ) resize() resize() 800 800 800个座位(增加了300个座位),而这个气球(其实已经不是同一个气球了,已经换成了一个更大的气球)也膨胀到了可以容纳下 800 800 800个人。

看看代码

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> concert;
    concert.reserve(500);
    concert.resize(300);
    cout << "capacity: " << concert.capacity() << endl;
    cout << "size: " << concert.size() << endl;
    
    concert.resize(800);
    cout << endl;
    cout << "capacity: " << concert.capacity() << endl;
    cout << "size: " << concert.size() << endl;
}

在这里插入图片描述
可以发现,resize() 调整大小小于 capacity 时,是不会改变 capacity 的,如果大于 capacity 时,则 capacity 也会一起增大。reserve() 的容量大于 capacity 时,也不会改变 size 的,但是如果 reserve 容量小于 resize 呢,答案是也不会改变 size。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> concert;
    concert.resize(3000);
    concert.reserve(300);
    cout << "capacity: " << concert.capacity() << endl;
    cout << "size: " << concert.size() << endl;
}

在这里插入图片描述

2. vector扩容机制导致迭代器失效

后来,周杰伦也来到了A体育馆开演唱会,因为是暴雨天,以为来的人很好,所以一开始就 r e s i z e ( ) resize() resize() 5000 5000 5000个座位,但是最后却来了 100000 100000 100000名观众,A体育馆容不下这么多人了怎么办,只能大家一起决定搬到另一个可以容纳 100000 100000 100000人的B体育馆。但是当他们全都搬到了B体育馆后,有些迟到的观众并不知道演唱会已经搬走了,他们拿着票才刚来到A体育馆,对着座位号一顿找却没找到座位(椅子已经搬走了),只找到原来椅子地方剩下的一些垃圾,这时候就是迭代器失效了。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> concert;
    concert.resize(5000); //一开始只放了5000把椅子
    auto it = concert.begin();
    cout << *it << endl;
    concert.resize(100000); // concert.reserve(100000); 效果一样 //后来换了场地,放了100000把椅子
    cout << *it << endl;
}

在这里插入图片描述
可以看到,当vecor resize()了更大的空间时,会在内从中找另外一块更大的连续内存,然后将数据拷贝过去,此时,在拷贝之前初始化的迭代器 it 仍然停留在原来的地址,所以在数据搬走之后,原来地方的值已经变成了内存中的随机值了。

那么如果周杰伦自信一点,一开始就决定在B体育馆开演唱会,那么也就是一开始就 reserve() 了100000人容量,那么大家也就不会因为场地不够而搬走,迟到的观众也不会找不到座位了。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> concert;
    concert.reserve(100000); //一开始就申请100000容量
    concert.resize(5000); //一开始只放了5000把椅子
    auto it = concert.begin();
    cout << *it << endl;
    concert.resize(100000); //reserve()效果一样 //后来调整到100000把椅子
    cout << *it << endl;
}

在这里插入图片描述
也就是说,一开始就申请足够的容量,就不容易发生数据搬迁拷贝情况,这样,迭代器就不会失效了。

三、总结

reserve() 的作用能够避免不必要的vector扩容,从而避免迭代器失效问题。resize() 调整的是数据的有效空间,对应着size(),而reserve调整的是总容量,对应capacity()。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值