vector size() 和 capacity() 的区别
liuian 2025-01-14 15:19 68 浏览
std::vector 是动态数组,存储的数据在内存上是连续的。
那size 和 capacity 有什么区别呢?虽然看起来很简单,但是不细想一下还是会混淆的。
看个例子就能理解了:
#include <iostream>
#include <iterator>
#include <vector>
void PrintVector(const std::vector<int> &a) {
std::cout << "\n==== size:" << a.size() << " capacity:" << a.capacity()
<< " ====" << std::endl;
for (auto p : a) {
std::cout << p << "\t";
}
std::cout << std::endl;
}
int main() {
std::vector<int> a(3, 3); // size 3 capacity 3
a.reserve(4); // 元素没有变化因此 size 3 容量提高了 因此 capacity 4
PrintVector(a);
a = {1, 2, 3}; // 元素改变因此size 3 原来的容量4足够存储了因此不变 capacity 4
PrintVector(a);
a.resize(10, 20); // 元素改变size10 多出来的元素20填充capacity需要提升为10
PrintVector(a);
a.resize(5, 30); // 元素减少 因此size 5 多出来的元素直接删除 capacity不变
PrintVector(a);
a.reserve(50); // 元素没有变化 因此size 5 capacity 50
PrintVector(a);
a.reserve(5); // 元素没有变化 因此size 5 capacity 已经大于5了 因此不变
PrintVector(a);
return 0;
}
// ================================================
==== size:3 capacity:4 ====
3 3 3
==== size:3 capacity:4 ====
1 2 3
==== size:10 capacity:10 ====
1 2 3 20 20 20 20 20 20 20
==== size:5 capacity:10 ====
1 2 3 20 20
==== size:5 capacity:50 ====
1 2 3 20 20
==== size:5 capacity:50 ====
1 2 3 20 20这里是不是发现为什么没有两倍扩容呢?
下面这个例子就会触发两倍扩容,原因是push_back 和 赋值操作(=)是不一样的,push_back 会在原有的内存上不断增加数据,直到超过容量了,重新分配一块新的内存块,而赋值操作则是每次都需要擦除原有数据,capacity 和 size 会保持一致。
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
std::cout << "Initial size: " << vec.size()
<< ", capacity: " << vec.capacity() << std::endl;
// 插入元素并观察容量变化
for (int i = 0; i < 20; ++i) {
vec.push_back(i);
std::cout << "After inserting element " << i << ": size = " << vec.size()
<< ", capacity = " << vec.capacity() << std::endl;
}
return 0;
}
// ================================================
Initial size: 0, capacity: 0
After inserting element 0: size = 1, capacity = 1
After inserting element 1: size = 2, capacity = 2
After inserting element 2: size = 3, capacity = 4
After inserting element 3: size = 4, capacity = 4
After inserting element 4: size = 5, capacity = 8
After inserting element 5: size = 6, capacity = 8
After inserting element 6: size = 7, capacity = 8
After inserting element 7: size = 8, capacity = 8
After inserting element 8: size = 9, capacity = 16
After inserting element 9: size = 10, capacity = 16
After inserting element 10: size = 11, capacity = 16
After inserting element 11: size = 12, capacity = 16
After inserting element 12: size = 13, capacity = 16
After inserting element 13: size = 14, capacity = 16
After inserting element 14: size = 15, capacity = 16
After inserting element 15: size = 16, capacity = 16
After inserting element 16: size = 17, capacity = 32
After inserting element 17: size = 18, capacity = 32
After inserting element 18: size = 19, capacity = 32
After inserting element 19: size = 20, capacity = 32总结:
--1 size 是元素个数 capacity 是容量大小
--2 size 随着元素个数变化实时变化 capacity 只有当容量不足的时候才会重新分配
--3 push_back 会触发两倍扩容 而 = 赋值运算并不会
相关推荐
- 万能app破解器(万能app软件破解器)
-
1、以现有的技术手段,是没有办法破解WPA的加密方式(现在基本上全部WIFI的加密方式),WPA的加密方式安全性很高,根本就破不了。2、即使破解密码,人家也有可能设置了MAC地址过滤,还是上不去。3、...
- 笔记本电脑自带摄像头怎么开启
-
要使用笔记本电脑自带的摄像头,请按照以下步骤操作:1.打开你的电脑,进入桌面。2.定位摄像头,通常在笔记本电脑的上部或者展开的屏幕的中央位置。3.双击摄像头图标,或者在键盘上按下对应的快捷键,以...
- 怎么知道wifi密码(手机连接上wifi怎么知道wifi密码)
-
关于这个问题,如果您想查看已经连接过的无线网络密码,请按照以下步骤操作:对于Windows10:1.点击任务栏中的WiFi图标,选择“网络和Internet设置”2.在“网络和Internet设...
- 电脑如何调出任务管理器(电脑如何调出任务管理器快捷键)
-
在Windows操作系统中,可以通过以下方法调出任务管理器:使用快捷键:按下“Ctrl+Shift+Esc”快捷键组合,即可快速打开任务管理器。使用组合键:按下“Ctrl+Alt+...
- win732位怎么还原系统(win732位gho)
-
系统安装失败,在以前的系统没有备份的情况下,是不能恢复的。只要诺顿开始运行,,不管进度条在什么位置,原系统都被格式化。如果有备份文件,那么方法是:1、打开系统备份还原软件:2、点击浏览,找到备份文件,...
- 电脑装什么杀毒软件(电脑装什么杀毒软件最安全)
-
好用的电脑杀毒软件,目前比较知名的有360杀软,腾讯电脑管家,金山毒霸,瑞星等杀毒软件,至于哪一个更好用,就看你自己的习惯了,我个人觉得360比较让人放心一些,这些年也一直用着360,比较安全有保证,...
- u盘uefi是什么意思(u盘用uefi模式启动)
-
u盘启动盘是指在U盘里安装PE版的操作系统后,把系统设置成从U盘启动,然后电脑开机就从U盘开始重装系统。UEFI,全称“统一的可扩展固件接口”,是一种详细描述类型接口的标准。这种接口用于操作系统自动...
- 天猫积分兑换根本抢不到(2021天猫积分兑换根本抢不到)
-
因为天猫积分的东西是有限的,但是很多人想要它们。如果你想抢到它,你最好注意启动秒杀的时间,在你启动倒计时时做好准备,并立即点击交换验证码,然后点击确认。一般最慢的时间是十秒内甚至四五秒内下单,五分钟内...
- win10任务管理器未响应(win10任务管理器没反应)
-
未响应这种情况应该是:1、说明程序是正在运行,但由于是系统运行内存不足,或者病毒、垃圾等造成的系统卡顿了。2、可以尝试重启系统、杀毒、清理垃圾即可。解决方法一:双击“此电脑”我的电脑的时候,出现资源管...
-
- 新电脑装win7进不了系统(新电脑安装win7系统启动不了)
-
解决方法:1、开机按F8,选择“最好一次正确配置”尝试修复。2、开机按F8,选择“安全模式”尝试修复。3、如果方法1,2不能修复,通过系统还原或者重新安装系统修复。二、如果软件无法修复,仍然无法启动,那么就是硬件故障原因造成的。比如硬盘、主...
-
2025-12-25 21:55 liuian
-
- 台式键盘锁住了打不了字怎么解锁
-
1.找到在键盘上靠左侧的位置,有一个fn的键,按住fn键。2.然后找到键盘最上面f8的键,把fn和f8一起按住,即可完成操作。3.然后此时看到键盘已经解除锁定,就可以可以正常输入了,这样就完成了键盘的解锁操作。...
-
2025-12-25 21:05 liuian
- 怎么超频显卡(显卡怎么超频使用)
-
显卡超频犯法如下:1、首先是显卡体质的检测,如果不知道显卡的体质,盲目加电压或者频率很容易导致超频的失败,检测显卡体质需要用到软件超频和拷机软件。2、接下来是BIOS准备阶段,用户可以选择从现有显卡提...
- 自动关机怎么设置win10指令(win10设置自动关机代码)
-
1最简单的方法是通过系统自带的计划任务来设置自动开关机。2打开‘任务计划程序’,选择‘创建基本任务’,按照提示完成设置,可以选择定时执行或在特定条件下执行。3另外也可以通过第三方软件来实现自动开...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
