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

C++动态数组vector全面解析

一、上期回顾

掌握了 C++ STLstring字符串类的构造、赋值、遍历、常用接口、与 C 字符数组互转。今天开始学习STL 最常用动态数组:vector

二、vector 是什么

vector动态数组

  • 底层还是连续内存,和普通数组一样支持随机访问
  • 自动扩容,不用手动关心大小
  • 封装了增删改查全套接口,比原生数组安全好用

三、vector 相比于普通数组优势

  1. 普通数组:固定长度,容易越界、栈溢出
  2. vector:动态自动扩容,空间灵活
  3. 支持直接赋值、拷贝、整体初始化
  4. 自带大小、容量、清空、插入删除接口
  5. 可以作为函数返回值,不用手动管理内存

四、vector 常用构造方式

#include <iostream> #include <vector> using namespace std; int main() { // 1. 空容器 vector<int> v1; // 2. n个初始化为0 vector<int> v2(5); // 3. n个相同值 vector<int> v3(5, 10); // 4. 拷贝构造 vector<int> v4(v3); // 5. 数组区间构造 int arr[] = {1,2,3,4}; vector<int> v5(arr, arr+4); return 0; }

五、vector 常用赋值方式

vector<int> v1 = {1,2,3}; vector<int> v2; // 1. 直接赋值 v2 = v1; // 2. assign 赋值 v2.assign(3, 66); // 3. 区间赋值 v2.assign(v1.begin(), v1.end());

六、vector 遍历三种方式

vector<int> v = {10,20,30,40}; // 1. 下标遍历 for(int i = 0; i < v.size(); i++) { cout << v[i] << " "; } // 2. 迭代器遍历 for(vector<int>::iterator it = v.begin(); it != v.end(); ++it) { cout << *it << " "; } // 3. C++11 范围for for(auto val : v) { cout << val << " "; }

七、vector 核心接口必背

vector<int> v; // 尾部插入 v.push_back(10); // 尾部删除 v.pop_back(); // 获取元素个数 v.size(); // 获取容量 v.capacity(); // 判断是否为空 v.empty(); // 清空元素 v.clear(); // 指定位置插入 v.insert(v.begin(), 99); // 指定位置删除 v.erase(v.begin()); // 预留空间,减少扩容 v.reserve(100); // 重置大小 v.resize(10);

八、size 与 capacity 区别(面试常问)

  • size:当前实际元素个数
  • capacity:已经分配的内存容量
  • size == capacity再插入元素,vector自动扩容

九、vector 扩容机制原理

  1. vector 底层连续内存,满了不能原地扩展
  2. 重新开辟一块更大内存
  3. 把旧元素拷贝到新空间
  4. 释放旧内存
  5. 指向新空间

一般扩容规则:

  • 2 倍 或 1.5 倍 扩容(不同编译器略有差异)
  • 提前用reserve()预留空间,可避免多次扩容,提升效率

十、完整综合示例代码

#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; // 尾插元素 v.push_back(1); v.push_back(2); v.push_back(3); cout << "元素遍历:"; for(auto val : v) { cout << val << " "; } cout << endl; cout << "size:" << v.size() << endl; cout << "capacity:" << v.capacity() << endl; // 头部插入 v.insert(v.begin(), 99); cout << "插入后第一个元素:" << v[0] << endl; // 清空 v.clear(); cout << "清空后size:" << v.size() << endl; return 0; }

十一、今日核心总结

  1. vector 是动态连续数组,替代原生数组首选
  2. size 实际元素数,capacity 已分配容量
  3. 三种遍历:下标、迭代器、范围 for
  4. 常用操作:push_back、pop_back、insert、erase、clear
  5. 提前 reserve 预留空间,减少自动扩容开销

十二、课后练习

  1. 创建 vector 存入 1~10,遍历打印
  2. 在第 2 个位置插入数值 66
  3. 删除最后一个元素,观察 size 变化
http://www.jsqmd.com/news/754725/

相关文章:

  • 智能代理系统记忆模块优化实战
  • WarpGPT:为AI大语言模型打造的网页内容抓取与解析中间件
  • 思源象棋v0.0.11 PWA 版正式上线!无需安装,点开即玩,支持添加到桌面/程序坞
  • egergergeeert效果展示:软光渲染下皮肤质感与布料纹理的细节表现
  • 田口法/灰关联分析
  • 别再写SQL了!MyBatis-Plus的remove()方法,一行代码清空Spring Boot项目里的表数据
  • 告别Visio!用WaveDrom Editor 3.4.0画数字时序图,效率提升不止一点点
  • OpenGPT-4o-Image:多模态AI图像数据集解析与应用
  • GUI与API融合的自动化工具开发实践
  • 别再傻傻分不清了!iSCSI、FCoE、IB、RDMA、NVMe-oF,一张图帮你搞定存储网络协议选型
  • D2DX:让经典《暗黑破坏神2》在现代PC上重获新生的三大秘诀
  • 基于LoRA与对比学习的视频检索技术实践
  • 深度学习实战-基于EfficientNetB5的家禽鸡病图像分类识别模型
  • 工业级 AI 神经网络语音处理模组 A-59 设计与应用研究
  • R语言实战:手把手教你用ggplot2和ggrepel搞定带基因标签的火山图(避坑指南)
  • Qwen3.5-2B应用场景:HR部门用简历截图→自动提取技能关键词+匹配
  • real-anime-z企业应用:小型动漫工作室低成本批量生成角色设定稿
  • 别再死磕固定感受野了!用PyTorch手把手实现DCNv2,让卷积核学会‘变形’
  • 终极指南:5步掌握PiliPlus开源B站客户端的完整跨平台体验
  • AI赋能开发:指令直达,用快马AI基于LangChain镜像构建智能问答应用
  • Docker Compose与Nginx构建一体化Web开发环境实战指南
  • Java 并发中的原子类
  • 2026年4月目前做得好的包衣烘干一体机直销厂家口碑推荐,蒸汽去皮机/法式薯条加工,包衣烘干一体机实力厂家哪家可靠 - 品牌推荐师
  • C# 13模块化开发实战:3步将遗留控制台项目升级为NuGet可引用模块(附自动化迁移脚本)
  • C++27原子操作性能跃迁指南(LLVM 18+Clang 19实测基准报告):从32ns到8.6ns的确定性优化闭环
  • ARM架构STR指令详解与应用实践
  • 如何用Dell Fans Controller实现戴尔服务器风扇静音控制?5个实用技巧
  • 别再只调波特率了!STM32CubeMX配置RS485半双工通信的完整避坑指南(附收发切换代码)
  • 保姆级教程:LSF集群资源限制(limit)配置详解,从配置文件到实战避坑
  • LFM2-2.6B-GGUF快速上手:WebUI中快捷键与输入法兼容技巧