当前位置: 首页 > news >正文

C++ STL,resize 和 reserve 的区别

结论放前边: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;
}

在这里插入图片描述

http://www.lryc.cn/news/56644.html

相关文章:

  • Java——详解ReentrantLock与AQS的关联以及AQS的数据结构和同步状态State
  • vue3+vite+ts 接入QQ登录
  • 消息队列kafka及zookeeper机制
  • 分布式 - 分布式体系架构:IT架构的演进过程
  • CSDN 周赛42期
  • Vue:初识Vue
  • linux语言学习记录
  • 面向对象编程(进阶)7:面向对象特征三:多态性
  • vue尚品汇商城项目-day04【29.加入购物车操作(难点)】
  • KubeSphere 社区双周报 | 4.8 深圳站 Meetup 火热报名中 | 2023.3.17-3.30
  • ChatGPT热炒之前 搜索引擎SEO算法已经悄然改变
  • 【Linux】Mysql之视图的基本操作
  • 《扬帆优配》西藏地震!美史上最严排放新规将出台,美股收涨
  • Python 小型项目大全 66~70
  • Barra模型因子的构建及应用系列八之Earning_Yeild因子
  • 2022蓝桥杯省赛——卡片
  • 数据结构-快速排序
  • WuThreat身份安全云-TVD每日漏洞情报-2023-04-10
  • IDEA中查看源码点击Download Sources时出现Cannot download sources的问题复现及解决
  • R+VIC模型融合实践技术应用及未来气候变化模型预测/SWAT/HSPF/HEC-HMS
  • Python 02 数据类型(04元组)
  • WMS:入库库作业流程状态定位
  • 蓝易云:Linux系统【Centos7】如何配置完整的CC攻击防护策略
  • 编解码持续升级,「硬」实力铸就视频云最优解
  • 贵金属技术分析的止损保护
  • Python 进阶指南(编程轻松进阶):三、使用 Black 工具来格式化代码
  • 计算机应用辅导大纲及真题
  • 【Go基础】一篇文章带你全面了解学习—切片
  • 2022国赛28:centos8.5离线安装docker
  • JVM专题