【std::vector】resize元素处理方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


你想弄清楚这段C++代码中,vector执行resize(5)后原10个元素里后5个的处理方式,以及resize(7)新增的两个元素的值,同时理解sizecapacity的变化,我会准确解答这些问题。

核心原理与代码验证

首先给出完整可运行的代码(补全头文件),并展示输出结果,再分步解释关键逻辑:

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int>v(10, 5);  // 初始化:10个元素,每个值为5
    cout << v.size() << "  " << v.capacity() << endl;
    for (int i : v) {
        cout << i << "  ";
    }
    cout << endl;
    
    v.resize(5);  // 缩小size到5
    cout << v.size() << "  " << v.capacity() << endl;
    for (int i : v) {
        cout << i << "  ";
    }
    cout << endl;
    
    v.resize(7);  // 扩大size到7
    cout << v.size() << "  " << v.capacity() << endl;
    for (int i : v) {
        cout << i << "  ";
    }
    cout << endl;

    return 0;
}

输出结果

复制代码
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销毁 索引从nsize()-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:新增元素未超出已分配的内存范围,无需扩容。

总结

  1. resize(5):销毁后5个元素(索引5~9),size变为5,capacity仍为10,有效元素仅前5个5。
  2. resize(7):新增2个元素,用int默认值0初始化(非原5),size变为7,capacity仍为10。
  3. vectorcapacity仅在新增元素超出当前容量时扩容,resize不会主动缩容/扩容(仅调整有效元素数)。
相关推荐
A星空12322 分钟前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c
凡人叶枫43 分钟前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
会叫的恐龙1 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米6011 小时前
C++顺序表和vector
开发语言·c++·算法
独望漫天星辰1 小时前
C++ 多态深度解析:从语法规则到底层实现(附实战验证代码)
开发语言·c++
王老师青少年编程2 小时前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)
c++·题解·真题·csp·信奥赛·csp-s·提高组
凡人叶枫2 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
CSDN_RTKLIB2 小时前
使用三方库头文件未使用导出符号情景
c++
rainbow68894 小时前
Linux文件描述符与重定向原理
c++
CodeSheep程序羊5 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展