发布时间:2026/8/19 20:41:16
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/8/19 20:36:15

计算机初学1

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

2026/8/19 20:36:15

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

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

2026/8/19 20:36:15

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

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

2026/8/19 21:51:20

RT-Thread消息队列实战:从轮询到高效线程通信的设计模式

1. 从“轮询”到“消息”:为什么我们需要消息队列 在嵌入式开发,尤其是RT-Thread这类实时操作系统的应用里,线程(或任务)间的通信是一个绕不开的核心话题。很多初学者,包括我自己刚入门时,最容易…

2026/8/19 21:51:20

AURIX™ TC3xx在智能小车开发中的核心优势与实战指南

1. 项目背景与AURIX™在智能小车领域的崛起最近在整理工创赛和各类电子设计竞赛的资料,发现一个非常明显的趋势:越来越多的智能小车项目,无论是物流搬运、循迹避障还是竞速,其主控芯片的选择正在从传统的STM32、51单片机&#xff…

2026/8/19 21:51:20

常见的单向散列(哈希)算法

MD5 和 SHA-256 都是计算机领域非常著名的哈希算法(Hash Algorithm),也叫散列算法。它们的作用是把任意长度的数据(一段文字、一个文件等)映射成一个固定长度的“数字指纹”或“摘要”。虽然它们的作用本质一样&#x…

2026/8/19 21:51:20

LCD显示模块实战指南:从I2C/SPI驱动到性能优化全解析

1. 项目概述:从“黑盒子”到“信息窗口”的探索 在嵌入式开发和电子DIY的世界里,LCD显示模块绝对算得上是“元老级”的明星组件。你可能没听过它的全名“液晶显示模块”,但你一定在无数设备上见过它的身影:从老式计算器、电子秤&a…

2026/8/19 4:14:28

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 15:09:57

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/19 0:00:35

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:35

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:36

Agentic Web:构建智能体原生网络的基础设施挑战与四大支柱

1. 从“被动网络”到“能动网络”:一个正在发生的范式转移 如果你最近关注AI和Web技术的前沿动态,可能会频繁听到“Agentic Web”这个词。它不像“Web3”那样带着浓厚的金融色彩,也不像“元宇宙”那样充满科幻感,但它所描绘的未来…

2026/8/18 18:23:10

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/19 4:14:38

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/19 16:39:34

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…