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 主题的线下活动…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点
中科院1区顶刊|IF14:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点 当下,免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入,我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...
