提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 核心原理与代码验证
- 分步解释关键问题
- 1. `v.resize(5)` 对后5个元素的处理
- 2. `v.resize(7)` 新增元素的值
- 总结
你想弄清楚这段C++代码中,vector执行resize(5)后原10个元素里后5个的处理方式,以及resize(7)新增的两个元素的值,同时理解size和capacity的变化,我会准确解答这些问题。
核心原理与代码验证
首先给出完整可运行的代码(补全头文件),并展示输出结果,再分步解释关键逻辑:
#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>v(10,5);// 初始化:10个元素,每个值为5cout<<v.size()<<" "<<v.capacity()<<endl;for(inti:v){cout<<i<<" ";}cout<<endl;v.resize(5);// 缩小size到5cout<<v.size()<<" "<<v.capacity()<<endl;for(inti:v){cout<<i<<" ";}cout<<endl;v.resize(7);// 扩大size到7cout<<v.size()<<" "<<v.capacity()<<endl;for(inti:v){cout<<i<<" ";}cout<<endl;return0;}输出结果:
10 10 5 5 5 5 5 5 5 5 5 5 5 10 5 5 5 5 5 7 10 5 5 5 5 5 0 0分步解释关键问题
1.v.resize(5)对后5个元素的处理
resize(n)的核心作用是调整vector的有效元素个数(size),而非释放内存(capacity):
- 当
n < 当前size时:vector会销毁索引从n到size()-1的元素(这里是索引5~9的5个元素),这些元素不再属于vector的“有效元素范围”,访问它们属于未定义行为(不能假设它们保持5或被清零)。 capacity保持不变(仍为10):vector为了效率,不会主动释放已分配的内存(缩容需要手动触发,比如shrink_to_fit())。- 最终有效元素仅保留前5个,值仍为5。
2.v.resize(7)新增元素的值
当n > 当前size时:vector会在末尾新增n - 当前size个元素(这里是2个):
- 若
resize未指定新元素的初始值,新增元素会用元素类型的默认值初始化:int类型的默认值是0,因此新增的2个元素(索引5、6)的值是0,而非原来的5(原后5个元素已被销毁,内存空间虽未释放,但已不属于有效元素)。
capacity仍为10:新增元素未超出已分配的内存范围,无需扩容。
总结
resize(5):销毁后5个元素(索引5~9),size变为5,capacity仍为10,有效元素仅前5个5。resize(7):新增2个元素,用int默认值0初始化(非原5),size变为7,capacity仍为10。vector的capacity仅在新增元素超出当前容量时扩容,resize不会主动缩容/扩容(仅调整有效元素数)。