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 主题的线下活动…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
