C++ STL,resize 和 reserve 的区别

resize会增加容器大小并填充默认值,使size等于capacity,而reserve仅增加capacity,不改变size。在resize后使用push_back可能导致额外扩容,reserve后push_back会在现有元素后添加新元素。
摘要由CSDN通过智能技术生成

结论放前边:resizereserve都可以给容器扩容,区别在于resize会进行填充,使容器处于满员的状态,即size=capacity,而reserve不会填充,有size<capacity.

1. size 和 capacity 的区别

size和capacity是容器非常重要的两个概念,capacity表示容器的容量,也就是能存储元素的上限数量,size表示容器当前存在多少元素。
所以在多数时候,size和capacity是不相等的,且满足size<=capacity。

2. resize 和 reserve 的区别

了解了size和capacity的区别,接下来就更好理解了。
回顾一下这俩函数的原型:

resize(std::size_t new_size)
reserve(std::size_t new_cap)

std::size_t不重要,当成int看就行。resize和reserve都是容器的成员函数,以obj.resize(n), obj.reseve(n)的形式来调用,如果n小于当前的size,则什么都不干;同样,如果n小于capacity,也不会进行任何操作。
如果n大于当前的size,resize函数会先扩容到n,然后将新增的空间,用默认值填充,相当于resize之后,obj是满的;如果n大于capacity,reserve函数只进行扩容,不做填充。
看个例子:

#include <vector>
#include <iostream>

using namespace std;

class A {
public:
    A(){cout<<"A::constructor"<<endl;}
    void display(){cout<<"dispaly"<<endl;}
};

int main() {
    vector<A> v;
    v.resize(5);   //进行填充
    cout << v.capacity() << " " << v.size() << endl;

    vector<A> x;
    x.reserve(5);  //不填充
    cout << x.capacity() << " " << x.size() << endl;
}

运行结果:
在这里插入图片描述可以看到,reisze扩容之后,会进行元素填充,调用了构造函数,而reserve不会。

3. 值得注意的一点

resize和reserve扩容处理的区别,带来了主要问题就是push函数使用问题,比如vector的push_back()函数,如果是resize之后再push_back,容器会继续扩容,因为这时候容器已经满了;如果是reverse之后push_back,则会放到vector现有元素的后边。

#include <vector>
#include <iostream>

using namespace std;

class A {
public:
    A(){cout<<"A::constructor"<<endl;}
    void display(){cout<<"dispaly"<<endl;}
};

int main() {
    vector<A> v;
    v.resize(5);   //进行填充
    v.push_back(A());
    cout << v.capacity() << " " << v.size() << endl;

    vector<A> x;
    x.reserve(5);  //不填充
    x.push_back(A());
    cout << x.capacity() << " " << x.size() << endl;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值