c++ 中的容器 vector 与数组 array
当初自学 c++ 与 c 语言时,一直被指针弄的云里雾里。后来 c++ 中引入了容器,避免了指针。但是,一些教材把容器的章节放在书本中后面的章节,太不合理。应该把这种方便的功能放到前面,这样一些初学者就不会遇到太多生硬难懂的知识点从而对这个语言望而却步了。这篇博客让 AI 总结了相关知识点,方便自己以后查阅。
总结:
- 对于定长数组,用 array
- 不定长数组,用 vector
- 计算规模巨大,实在想优化计算速度,用指针
文章目录
- 一、 **C++ 中的 `std::vector`**
- **1. `std::vector` 基本使用**
- **(1) 引入 `<vector>` 头文件**
- **2. `std::vector` 的核心方法**
- **3. `vector` 详细示例**
- **(1) 创建和初始化**
- **(2) `push_back()` 和 `pop_back()`**
- **(3) `insert()` 和 `erase()`**
- **4. `vector` 与普通数组的对比**
- **5. 总结**
- 二、 **C++ 中的 `std::array`**
- **1. `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>
头文件
#include <iostream>
#include <vector>int main() {std::vector<int> v = {1, 2, 3, 4, 5};// 遍历 vectorfor (int i : v) {std::cout << i << " ";}return 0;
}
输出:
1 2 3 4 5
2. std::vector
的核心方法
方法 | 作用 |
---|---|
push_back(value) | 在末尾添加元素 |
pop_back() | 删除末尾元素 |
size() | 返回元素个数 |
capacity() | 返回当前容量 |
resize(n) | 调整大小(可能会丢弃元素) |
clear() | 清空所有元素 |
empty() | 判断是否为空 |
insert(it, value) | 在指定位置插入元素 |
erase(it) | 删除指定位置的元素 |
front() / back() | 返回首/尾元素 |
at(i) | 获取指定索引元素(带边界检查) |
operator[] | 获取指定索引元素(无边界检查) |
3. vector
详细示例
(1) 创建和初始化
#include <iostream>
#include <vector>int main() {std::vector<int> v1; // 空 vectorstd::vector<int> v2(5, 100); // 5 个 100std::vector<int> v3 = {10, 20, 30}; // 列表初始化std::vector<int> v4(v3); // 复制 v3std::vector<int> v5(v3.begin(), v3.end()); // 迭代器初始化for (int x : v2) std::cout << x << " "; // 输出: 100 100 100 100 100
}
(2) push_back()
和 pop_back()
#include <iostream>
#include <vector>int main() {std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);std::cout << "Size: " << v.size() << std::endl; // 3std::cout << "Last Element: " << v.back() << std::endl; // 3v.pop_back(); // 删除 3std::cout << "Size after pop: " << v.size() << std::endl; // 2
}
输出:
Size: 3
Last Element: 3
Size after pop: 2
(3) insert()
和 erase()
#include <iostream>
#include <vector>int main() {std::vector<int> v = {1, 2, 3, 4, 5};v.insert(v.begin() + 2, 99); // 在索引 2 位置插入 99v.erase(v.begin() + 1); // 删除索引 1 位置的元素for (int x : v) std::cout << x << " ";
}
输出:
1 99 3 4 5
4. 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::array<T, N> 的大小 N 在编译期确定,无法动态改变。 |
支持 std::vector 风格的接口 | 拥有 .size() , .at() , .front() , .back() , .fill() 等方法。 |
支持 std::algorithm | 可与 std::sort() , std::reverse() 等标准库算法配合使用。 |
内存布局 | 与 C 风格数组相同,连续存储,性能与 C-style array 相当,但 更安全。 |
2. std::array
的基本用法
(1) 创建与初始化
#include <iostream>
#include <array>int main() {std::array<int, 5> arr1 = {1, 2, 3, 4, 5}; // 列表初始化std::array<int, 5> arr2 = {0}; // 仅初始化第一个元素为 0,其余为 0std::array<int, 5> arr3{}; // 全部初始化为 0for (int num : arr1) std::cout << num << " "; // 1 2 3 4 5return 0;
}
3. std::array
的常用方法
方法 | 作用 |
---|---|
size() | 返回数组大小(固定值 N )。 |
at(index) | 获取指定索引的元素(带边界检查)。 |
operator[] | 获取指定索引的元素(不带边界检查)。 |
front() | 获取第一个元素。 |
back() | 获取最后一个元素。 |
fill(value) | 将所有元素设置为 value 。 |
swap(other) | 交换两个 std::array 的内容。 |
data() | 返回指向底层数组的指针。 |
4. std::array
方法示例
#include <iostream>
#include <array>int main() {std::array<int, 5> arr = {10, 20, 30, 40, 50};std::cout << "Size: " << arr.size() << std::endl; // 5std::cout << "First: " << arr.front() << std::endl; // 10std::cout << "Last: " << arr.back() << std::endl; // 50arr.fill(100); // 全部赋值为 100for (int x : arr) std::cout << x << " "; // 100 100 100 100 100return 0;
}
输出:
Size: 5
First: 10
Last: 50
100 100 100 100 100
5. std::array
与 C 风格数组的对比
特性 | std::array | C 风格数组 (T arr[N] ) |
---|---|---|
大小 | 固定,编译期确定 | 固定,编译期确定 |
安全性 | ✅ at() 带边界检查 | ❌ 越界访问未定义行为 |
STL 兼容性 | ✅ 支持 std::algorithm | ❌ 不兼容 STL |
拷贝 | ✅ 支持赋值(深拷贝) | ❌ 数组名是指针,不能直接赋值 |
性能 | ✅ 等同于 C 数组 | ✅ 等同于 std::array |
获取大小 | ✅ .size() | ❌ 需 sizeof(arr)/sizeof(arr[0]) |
6. std::array
在 STL 算法中的使用
#include <iostream>
#include <array>
#include <algorithm> // 用于 sort()int main() {std::array<int, 5> arr = {30, 10, 50, 20, 40};std::sort(arr.begin(), arr.end()); // 排序for (int x : arr) std::cout << x << " "; // 10 20 30 40 50
}
输出:
10 20 30 40 50
✅ std::array
支持 std::sort()
、std::reverse()
、std::find()
等 STL 算法。
7. 总结
特性 | std::array | std::vector | C 风格数组 |
---|---|---|---|
大小可变 | ❌ 否 | ✅ 是 | ❌ 否 |
边界检查 | ✅ at() | ✅ at() | ❌ 否 |
STL 兼容 | ✅ 是 | ✅ 是 | ❌ 否 |
性能 | ✅ 高效 | ⚠️ 可能有额外分配 | ✅ 高效 |
✅ 如果数组大小固定,推荐使用 std::array
。
✅ 如果数组需要动态扩展,使用 std::vector
。
✅ C 风格数组适用于对性能要求极高且手动管理数组的情况。
🚀 你对 std::array
还有其他问题吗?
相关文章:
c++ 中的容器 vector 与数组 array
当初自学 c 与 c 语言时,一直被指针弄的云里雾里。后来 c 中引入了容器,避免了指针。但是,一些教材把容器的章节放在书本中后面的章节,太不合理。应该把这种方便的功能放到前面,这样一些初学者就不会遇到太多生硬难懂的…...

我的世界1.20.1forge模组开发进阶物品(7)——具有动画、3D立体效果的物品
基础的物品大家都会做了对吧?包括武器的释放技能,这次来点难度,让物品的贴图呈现动画效果和扔出后显示3D立体效果,这个3D立体效果需要先学习blockbench,学习如何制作贴图。 Blockbench Blockbench是一个用于创建和编辑三维模型的免费软件,特别适用于Minecraft模型的设计…...
ubuntu22.04安装docker engine
在Ubuntu 22.04上安装Docker Engine可以通过以下步骤完成: 更新系统包索引: sudo apt update安装必要的依赖包: 这些包允许apt通过HTTPS使用仓库。 sudo apt install -y apt-transport-https ca-certificates curl software-properties-commo…...

性能测试测试策略制定|知名软件测评机构经验分享
随着互联网产品的普及,产品面对的用户量级也越来越大,能抗住指数级增长的瞬间访问量以及交易量是保障购物体验是否顺畅的至关重要的一环,而我们的性能测试恰恰也是为此而存在的。 性能测试是什么呢?性能测试要怎么测呢?…...
Let‘s Encrypt免费证书的应用示例
文章目录 前言证书申请证书介绍cert.pemchain.pemfullchain.pemprivkey.pem 使用步骤搭建简易demo应用新建nginx配置文件测试SSL是否生效 总结 前言 最近在搞苹果应用上架的问题,据说用HTTP会被拒,但貌似不绝对,2017年苹果曾发公告说必须要求…...

threeJS——安装以及三要素
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装二、三要素1.场景1.1创建场景1.2向场景添加元素1.3场景属性 2.相机2.1相机特点2.2正交相机2.3空间布局2.4小姐操作 3.渲染器 总结 前言 本章简单介绍前…...
【Electron入门】进程环境和隔离
目录 一、主进程和渲染进程 1、主进程(main) 2、渲染进程(renderer) 二、预加载脚本 三、沙盒化 为单个进程禁用沙盒 全局启用沙盒 四、环境访问权限控制:contextIsolation和nodeIntegration 1、contextIsola…...
提示词框架介绍和使用场景
框架介绍 CO-STAR 框架 定义 CO-STAR是六个关键要素的缩写,每个字母代表一个特定的部分: Context(上下文) :提供任务的背景信息或环境 当前任务是为一家科技公司撰写一篇关于人工智能发展趋势的文章/ 需要为一场面向高中生的科普讲座准备内容Objective(目标) :明确任…...

牛客NC288803 和+和
import java.util.Comparator;import java.util.PriorityQueue;import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建Scanner对象用于读取输入Scanner sc new Scanner(System.in);// 读取两个整数n和m,分别表示数组的…...
AI学习第七天
数组:基础概念、存储特性及力扣实战应用 在计算机科学与数学的广袤领域中,数组作为一种极为重要的数据结构,发挥着不可或缺的作用。它就像一个有序的 “数据仓库”,能高效地存储和管理大量数据。接下来,让我们深入了解…...

【uniapp原生】实时记录接口请求延迟,并生成写入文件到安卓设备
在开发实时数据监控应用时,记录接口请求的延迟对于性能分析和用户体验优化至关重要。本文将基于 UniApp 框架,介绍如何实现一个实时记录接口请求延迟的功能,并深入解析相关代码的实现细节。 前期准备&必要的理解 1. 功能概述 该功能的…...
XR应用测试:探索虚拟与现实的边界
引言 随着XR(扩展现实,Extended Reality)技术的快速发展,VR(虚拟现实)、AR(增强现实)和MR(混合现实)应用逐渐渗透到游戏、教育、医疗、工业等多个领域。对于…...
算法之算法思想
算法思想 ♥算法思想知识体系详解♥ | Java 全栈知识体系 经典算法思想总结 经典算法思想总结(含LeetCode题目推荐) | JavaGuide...

mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽
问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键,然后点击屏幕顶部的Wi-Fi图标;2.从下拉菜单中选择 “打开无线诊断”(Open Wireless Diagnostics);3.你可能会看到一个提示窗口,…...
物理竞赛中的线性代数
线性代数 1 行列式 1.1 n n n 阶行列式 定义 1.1.1:称以下的式子为一个 n n n 阶行列式: ∣ A ∣ ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}\mathbf A\end{vmatrix} \begin{vmatrix} a_{11…...

FFmpeg-chapter3-读取视频流(原理篇)
ffmpeg网站:About FFmpeg 1 库介绍 (1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 (2)libavcodec是一个包含音频/视频编解码器的解码器和编…...
机器视觉线阵相机分时频闪选型/机器视觉线阵相机分时频闪选型
在机器视觉系统中,线阵相机的分时频闪技术通过单次扫描切换不同光源或亮度,实现在一幅图像中捕捉多角度光照效果,从而提升缺陷检测效率并降低成本。以下是分时频闪线阵相机的选型要点及关键考量因素: 一、分时频闪技术的核心需求 多光源同步控制 分时频闪需相机支持多路光源…...
「Selenium+Python自动化从0到1②|2025浏览器操控7大核心API实战(附高效避坑模板))」
Python 自动化操作浏览器基础方法 在进行 Web 自动化测试时,操作浏览器是必不可少的环节。Python 结合 Selenium 提供了强大的浏览器操作功能,让我们能够轻松地控制浏览器执行各种任务。本文将详细介绍如何使用 Python 和 Selenium 操作浏览器的基本方法…...
矩阵系列 题解
1.洛谷 P1962 斐波那契数列 题意 大家都知道,斐波那契数列是满足如下性质的一个数列: F n { 1 ( n ≤ 2 ) F n − 1 F n − 2 ( n ≥ 3 ) F_n \left\{\begin{aligned} 1 \space (n \le 2) \\ F_{n-1}F_{n-2} \space (n\ge 3) \end{aligned}\right. …...

活动报名:Voice Agent 技术现状及应用展望丨 3.8 北京
「人人发言,所有人向所有人学习!」——Z 沙龙 「一起探索下一代语音驱动的人机交互界面。」——RTE 开发者社区 3 月 8 日周六下午,北京,「智谱 Z 计划&Z Fund」和「RTE 开发者社区」将合办一场 Voice Agent 主题的线下活动…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...