c++ 中的容器 vector 与数组 array

发布时间:2026/10/7 8:08:11

c++ 中的容器 vector 与数组 array 当初自学 c 与 c 语言时一直被指针弄的云里雾里。后来 c 中引入了容器避免了指针。但是一些教材把容器的章节放在书本中后面的章节太不合理。应该把这种方便的功能放到前面这样一些初学者就不会遇到太多生硬难懂的知识点从而对这个语言望而却步了。这篇博客让 AI 总结了相关知识点方便自己以后查阅。总结对于定长数组用 array不定长数组用 vector计算规模巨大实在想优化计算速度用指针文章目录一、 C 中的 std::vector1. std::vector 基本使用(1) 引入 vector 头文件(2) 创建和初始化2. std::vector 的核心方法3. vector 详细示例(1) push_back() 和 pop_back()(2) insert() 和 erase()4. vector 与普通数组的对比5. 总结二、 C 中的 std::array1. std::array 的特点2. std::array 的基本用法(1) 创建与初始化3. std::array 的常用方法4. std::array 方法示例5. std::array 与 C 风格数组的对比6. std::array 在 STL 算法中的使用7. 总结一、 C 中的std::vector在 C 中std::vector是动态数组容器提供了自动扩展、随机访问等功能是std::array和std::list之间的高效选择。std::vector定义在vector头文件中属于STL标准模板库的一部分。1.std::vector基本使用(1) 引入vector头文件#includeiostream#includevectorintmain(){std::vectorintv{1,2,3,4,5};// 遍历 vectorfor(inti:v){std::couti ;}return0;}输出1 2 3 4 5(2) 创建和初始化一般有两种方法用“大小 初始值”初始化std::vectorintv2(5);// 5 个 0 的一维数组std::vectorintv2(5,1);// 5 个 1 的一维数组// 小括号与中括号是不同的std::vectorintv2[5];// 这里表示创建 5 个一维空数组// 创建二维数组比较麻烦下面是 4 行 3 列的二维数组元素值都为 0std::vectorstd::vectordoublev1(4,std::vectordouble(3));// 下面是 4 行 3 列的二维数组每列元素值都为 {1, 2, 3}std::vectorstd::vectordoublev1(4,std::vectordouble{1,2,3});// 创建二维数组还有下面的简便表达std::vectorv1(4,std::vectordouble(3));范围初始化std::vectorintv3{10,20,30};// 列表初始化std::vectorintv5(v3.begin(),v3.end());// 迭代器初始化std::vectorintv5(v3.begin(),v3.begin()2);// 迭代器初始化还有一些例子#includeiostream#includevectorintmain(){std::vectorintv1;// 空 vectorstd::vectorintv2(5);// 5 个 0 的一维数组// 小括号与大括号是不同的std::vectorintv2[5];// 这里表示创建 5 个一维空数组// 创建二维数组比较麻烦下面是 4 行 3 列的二维数组元素值都为 0std::vectorstd::vectordoublev1(4,std::vectordouble(3));// 下面是 4 行 3 列的二维数组每列元素值都为 {1, 2, 3}std::vectorstd::vectordoublev1(4,std::vectordouble{1,2,3});// 创建二维数组还有下面的简便表达std::vectorv1(4,std::vectordouble(3));std::vectorintv2(5,100);// 5 个 100std::vectorintv3{10,20,30};// 列表初始化std::vectorintv4(v3);// 复制 v3std::vectorintv5(v3.begin(),v3.end());// 迭代器初始化for(intx:v2)std::coutx ;// 输出: 100 100 100 100 100}注意数组变量最后用小括号还是中括号是不一样的。若数组为一个类中的属性可以用大括号表示子数组的数量例如下面表示数组里面有两个子数组std::vectorstd::vectorintrecorded_pivot{2};初始化容器也可以使用列表初始化适合固定内容std::vectorstd::vectorintmatrix{{1,2,3},{4,5,6},{7,8,9}};2.std::vector的核心方法方法作用push_back(value)在末尾添加元素pop_back()删除末尾元素size()返回元素个数capacity()返回当前容量resize(n)调整大小可能会丢弃元素clear()清空所有元素empty()判断是否为空insert(it, value)在指定位置插入元素erase(it)删除指定位置的元素front()/back()返回首/尾元素at(i)获取指定索引元素带边界检查operator[]获取指定索引元素无边界检查data()返回指向内部连续存储数组的指针首元素地址3.vector详细示例(1)push_back()和pop_back()#includeiostream#includevectorintmain(){std::vectorintv;v.push_back(1);v.push_back(2);v.push_back(3);std::coutSize: v.size()std::endl;// 3std::coutLast Element: v.back()std::endl;// 3v.pop_back();// 删除 3std::coutSize after pop: v.size()std::endl;// 2}输出Size: 3 Last Element: 3 Size after pop: 2(2)insert()和erase()#includeiostream#includevectorintmain(){std::vectorintv{1,2,3,4,5};v.insert(v.begin()2,99);// 在索引 2 位置插入 99v.erase(v.begin()1);// 删除索引 1 位置的元素for(intx:v)std::coutx ;}输出1 99 3 4 54.vector与普通数组的对比特性std::vector普通数组C-style array大小可变✅自动扩展❌固定大小安全性✅带边界检查 (at())❌无边界检查初始化✅支持列表初始化⚠️手动初始化复制✅支持赋值 ()❌需要memcpy()性能⚠️可能有额外开销✅更快不涉及动态分配STL 支持✅可与std::algorithm配合❌手动实现排序、查找等5. 总结std::vector是 C 动态数组支持自动扩展、插入、删除等功能。比普通数组更安全支持size(),push_back(),insert(),erase()等操作。适用于大部分需要动态管理数组的场景但在高性能需求下可以考虑std::array或std::deque。二、 C 中的std::array在 C 中std::array是STL标准模板库提供的定长数组容器它是std::vector和 C 风格数组 (C-style array) 之间的折中方案提供了更安全且性能优越的数组管理方式。1.std::array的特点特点描述固定大小std::arrayT, N的大小N在编译期确定无法动态改变。支持std::vector风格的接口拥有.size(),.at(),.front(),.back(),.fill()等方法。支持std::algorithm可与std::sort(),std::reverse()等标准库算法配合使用。内存布局与 C 风格数组相同连续存储性能与C-style array相当但更安全。2.std::array的基本用法(1) 创建与初始化#includeiostream#includearrayintmain(){std::arrayint,5arr1{1,2,3,4,5};// 列表初始化std::arrayint,5arr2{0};// 仅初始化第一个元素为 0其余为 0std::arrayint,5arr3{};// 全部初始化为 0for(intnum:arr1)std::coutnum ;// 1 2 3 4 5return0;}3.std::array的常用方法方法作用size()返回数组大小固定值N。at(index)获取指定索引的元素带边界检查。operator[]获取指定索引的元素不带边界检查。front()获取第一个元素。back()获取最后一个元素。fill(value)将所有元素设置为value。swap(other)交换两个std::array的内容。data()返回指向底层数组的指针。4.std::array方法示例#includeiostream#includearrayintmain(){std::arrayint,5arr{10,20,30,40,50};std::coutSize: arr.size()std::endl;// 5std::coutFirst: arr.front()std::endl;// 10std::coutLast: arr.back()std::endl;// 50arr.fill(100);// 全部赋值为 100for(intx:arr)std::coutx ;// 100 100 100 100 100return0;}输出Size: 5 First: 10 Last: 50 100 100 100 100 1005.std::array与 C 风格数组的对比特性std::arrayC 风格数组 (T arr[N])大小固定编译期确定固定编译期确定安全性✅at()带边界检查❌越界访问未定义行为STL 兼容性✅支持std::algorithm❌不兼容 STL拷贝✅支持赋值深拷贝❌数组名是指针不能直接赋值性能✅等同于 C 数组✅等同于std::array获取大小✅.size()❌ 需sizeof(arr)/sizeof(arr[0])6.std::array在 STL 算法中的使用#includeiostream#includearray#includealgorithm// 用于 sort()intmain(){std::arrayint,5arr{30,10,50,20,40};std::sort(arr.begin(),arr.end());// 排序for(intx:arr)std::coutx ;// 10 20 30 40 50}输出10 20 30 40 50✅std::array支持std::sort()、std::reverse()、std::find()等 STL 算法。7. 总结特性std::arraystd::vectorC 风格数组大小可变❌ 否✅ 是❌ 否边界检查✅at()✅at()❌ 否STL 兼容✅ 是✅ 是❌ 否性能✅ 高效⚠️ 可能有额外分配✅ 高效✅如果数组大小固定推荐使用std::array。✅如果数组需要动态扩展使用std::vector。✅C 风格数组适用于对性能要求极高且手动管理数组的情况。你对std::array还有其他问题吗
延伸阅读

更多相关文章

2026/10/5 2:40:10

计算机初学1

一、C语言 性能最高,适合底层开发和嵌入式系统。Java 适用于大型企业级系统开发和Android手机应用。Python 在高等数学计算、数据科学和人工智能领域应用广泛。二、C语言 是非托管代码,编译后直接生成机器指令,操作系统能直接识别和执行。其他…

2026/10/3 9:34:13

2026国赛C题模型稳健性(十六):灵敏度分析——扰动5%参数,观察模型“崩不崩”• 核心内容:控制变量法、局部灵敏度(One-factor-at-a-time)、可视化雷达图展示。

国赛期间专栏内发布相关内容,开赛后恢复原价158. 在数学建模竞赛中,一个模型的成功不仅取决于其对训练数据的拟合精度,更取决于其在参数发生微小波动时是否仍能保持输出结果的合理性与稳定性。模型稳健性,特别是对参数扰动的容忍能力,是评判模型质量的核心指标之一,也是…

2026/10/5 13:39:56

2026国赛C题前沿算法(十四):遗传算法(GA)求解复杂非线性规划——避开梯度下降的局部陷阱

国赛期间专栏内发布相关内容,开赛后恢复原价158. 摘要 在数学建模竞赛中,非线性规划问题始终占据着举足轻重的地位。然而,传统基于梯度的优化算法在面对复杂、非凸、多峰、不可微或离散决策空间时,常常陷入局部最优解的困境,难以实现全局寻优的目标。遗传算法作为一种模…

2026/10/7 15:46:38

Linux实训选题:单机版聊天室Socket编程与多线程并发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:46:38

ROS2工程化落地:ARM平台实战与DDS通信调优指南

1. 这套ROS2课程到底值不值得花时间啃?先说清楚它能解决什么真问题ROS2机器人应用开发工程师全套视频课程——光看标题,很多人第一反应是“又一套编程课”,但如果你正在做移动机器人、AGV调度系统、服务机器人导航模块,或者刚从RO…

2026/10/7 15:46:38

用了半年大模型,终于总结出这套 context-mode 上下文管理实战方案

你有没有遇到过这种场景:同一个大模型接口,别人调出来像聊天机器人,你调出来像金鱼——聊到第七句就把你第一句说过的话忘得一干二净。或者反过来,你给了模型一堆资料,结果它答非所问,从背景资料里挑了一条…

2026/10/7 15:46:38

marketingskills:基于Agent Skills规范的AI营销技能包实战指南

1. 从"marketingskills"这个命名说起:它到底想解决什么问题第一次看到marketingskills这个项目名,我的直觉是:这不是一个普通的工具库,而是一套"能力封装"。在 AI Agent 生态里,skills这个词最近被…

2026/10/7 15:46:38

AI芯片软硬件协同设计:脉动阵列与Transformer映射实战

1. AI 芯片软硬件协同设计的核心命题1.1 为什么单看硬件或软件都不够做 AI 芯片这行的人有个共识:硬件和软件分开设计,最后大概率要返工。我见过太多团队,硬件组把脉动阵列的面积和频率优化到极致,软件组把算子调度写得漂漂亮亮&a…

2026/10/7 15:41:37

医学图像分割实战:Python+PyTorch实现U-Net与Dice Loss全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

ESP32免重刷固件:浏览器直接修改NVS键值实现WiFi配置更新

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

SAP HANA查询结果导出CSV:避开乱码、性能与权限的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

数字后端Placement阶段Density与Congestion控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑