当前位置: 首页 > news >正文

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::arraystd::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::arraystd::deque

二、 C++ 中的 std::array

在 C++ 中,std::arraySTL(标准模板库) 提供的 定长数组容器,它是 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::arrayC 风格数组 (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::arraystd::vectorC 风格数组
大小可变❌ 否✅ 是❌ 否
边界检查at()at()❌ 否
STL 兼容✅ 是✅ 是❌ 否
性能✅ 高效⚠️ 可能有额外分配✅ 高效

如果数组大小固定,推荐使用 std::array
如果数组需要动态扩展,使用 std::vector
C 风格数组适用于对性能要求极高且手动管理数组的情况

🚀 你对 std::array 还有其他问题吗?

相关文章:

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

当初自学 c 与 c 语言时&#xff0c;一直被指针弄的云里雾里。后来 c 中引入了容器&#xff0c;避免了指针。但是&#xff0c;一些教材把容器的章节放在书本中后面的章节&#xff0c;太不合理。应该把这种方便的功能放到前面&#xff0c;这样一些初学者就不会遇到太多生硬难懂的…...

我的世界1.20.1forge模组开发进阶物品(7)——具有动画、3D立体效果的物品

基础的物品大家都会做了对吧?包括武器的释放技能,这次来点难度,让物品的贴图呈现动画效果和扔出后显示3D立体效果,这个3D立体效果需要先学习blockbench,学习如何制作贴图。 Blockbench Blockbench是一个用于创建和编辑三维模型的免费软件,特别适用于Minecraft模型的设计…...

ubuntu22.04安装docker engine

在Ubuntu 22.04上安装Docker Engine可以通过以下步骤完成&#xff1a; 更新系统包索引&#xff1a; sudo apt update安装必要的依赖包&#xff1a; 这些包允许apt通过HTTPS使用仓库。 sudo apt install -y apt-transport-https ca-certificates curl software-properties-commo…...

性能测试测试策略制定|知名软件测评机构经验分享

随着互联网产品的普及&#xff0c;产品面对的用户量级也越来越大&#xff0c;能抗住指数级增长的瞬间访问量以及交易量是保障购物体验是否顺畅的至关重要的一环&#xff0c;而我们的性能测试恰恰也是为此而存在的。 性能测试是什么呢&#xff1f;性能测试要怎么测呢&#xff1f…...

Let‘s Encrypt免费证书的应用示例

文章目录 前言证书申请证书介绍cert.pemchain.pemfullchain.pemprivkey.pem 使用步骤搭建简易demo应用新建nginx配置文件测试SSL是否生效 总结 前言 最近在搞苹果应用上架的问题&#xff0c;据说用HTTP会被拒&#xff0c;但貌似不绝对&#xff0c;2017年苹果曾发公告说必须要求…...

threeJS——安装以及三要素

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装二、三要素1.场景1.1创建场景1.2向场景添加元素1.3场景属性 2.相机2.1相机特点2.2正交相机2.3空间布局2.4小姐操作 3.渲染器 总结 前言 本章简单介绍前…...

【Electron入门】进程环境和隔离

目录 一、主进程和渲染进程 1、主进程&#xff08;main&#xff09; 2、渲染进程&#xff08;renderer&#xff09; 二、预加载脚本 三、沙盒化 为单个进程禁用沙盒 全局启用沙盒 四、环境访问权限控制&#xff1a;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&#xff0c;分别表示数组的…...

AI学习第七天

数组&#xff1a;基础概念、存储特性及力扣实战应用 在计算机科学与数学的广袤领域中&#xff0c;数组作为一种极为重要的数据结构&#xff0c;发挥着不可或缺的作用。它就像一个有序的 “数据仓库”&#xff0c;能高效地存储和管理大量数据。接下来&#xff0c;让我们深入了解…...

【uniapp原生】实时记录接口请求延迟,并生成写入文件到安卓设备

在开发实时数据监控应用时&#xff0c;记录接口请求的延迟对于性能分析和用户体验优化至关重要。本文将基于 UniApp 框架&#xff0c;介绍如何实现一个实时记录接口请求延迟的功能&#xff0c;并深入解析相关代码的实现细节。 前期准备&必要的理解 1. 功能概述 该功能的…...

XR应用测试:探索虚拟与现实的边界

引言 随着XR&#xff08;扩展现实&#xff0c;Extended Reality&#xff09;技术的快速发展&#xff0c;VR&#xff08;虚拟现实&#xff09;、AR&#xff08;增强现实&#xff09;和MR&#xff08;混合现实&#xff09;应用逐渐渗透到游戏、教育、医疗、工业等多个领域。对于…...

算法之算法思想

算法思想 ♥算法思想知识体系详解♥ | Java 全栈知识体系 经典算法思想总结 经典算法思想总结&#xff08;含LeetCode题目推荐&#xff09; | JavaGuide...

mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽

问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键&#xff0c;然后点击屏幕顶部的Wi-Fi图标&#xff1b;2.从下拉菜单中选择 “打开无线诊断”&#xff08;Open Wireless Diagnostics&#xff09;&#xff1b;3.你可能会看到一个提示窗口&#xff0c;…...

物理竞赛中的线性代数

线性代数 1 行列式 1.1 n n n 阶行列式 定义 1.1.1&#xff1a;称以下的式子为一个 n n n 阶行列式&#xff1a; ∣ 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网站&#xff1a;About FFmpeg 1 库介绍 &#xff08;1&#xff09;libavutil是一个包含简化编程函数的库&#xff0c;包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 &#xff08;2&#xff09;libavcodec是一个包含音频/视频编解码器的解码器和编…...

机器视觉线阵相机分时频闪选型/机器视觉线阵相机分时频闪选型

在机器视觉系统中,线阵相机的分时频闪技术通过单次扫描切换不同光源或亮度,实现在一幅图像中捕捉多角度光照效果,从而提升缺陷检测效率并降低成本。以下是分时频闪线阵相机的选型要点及关键考量因素: 一、分时频闪技术的核心需求 多光源同步控制 分时频闪需相机支持多路光源…...

「Selenium+Python自动化从0到1②|2025浏览器操控7大核心API实战(附高效避坑模板))」

Python 自动化操作浏览器基础方法 在进行 Web 自动化测试时&#xff0c;操作浏览器是必不可少的环节。Python 结合 Selenium 提供了强大的浏览器操作功能&#xff0c;让我们能够轻松地控制浏览器执行各种任务。本文将详细介绍如何使用 Python 和 Selenium 操作浏览器的基本方法…...

矩阵系列 题解

1.洛谷 P1962 斐波那契数列 题意 大家都知道&#xff0c;斐波那契数列是满足如下性质的一个数列&#xff1a; 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 北京

「人人发言&#xff0c;所有人向所有人学习&#xff01;」——Z 沙龙 「一起探索下一代语音驱动的人机交互界面。」——RTE 开发者社区 3 月 8 日周六下午&#xff0c;北京&#xff0c;「智谱 Z 计划&Z Fund」和「RTE 开发者社区」将合办一场 Voice Agent 主题的线下活动…...

3D光学流技术在机器人动作生成中的应用与优化

1. 3D光学流技术解析与机器人动作生成3D光学流技术是计算机视觉领域的重要突破&#xff0c;它通过分析物体在三维空间中的连续运动轨迹&#xff0c;为机器人动作规划提供了前所未有的精确度。传统2D光学流仅能捕捉平面运动信息&#xff0c;而3D光学流则能完整重建物体在XYZ三个…...

构建高效的 Agent 任务队列

构建高效Agent任务队列:从第一性原理到生产级落地全指南 关键词 Agent任务队列、多智能体调度、优先级抢占、延迟敏感任务、分布式一致性、负载均衡、容错机制 摘要 随着大模型驱动的多Agent系统在企业服务、具身智能、自动驾驶等领域的规模化落地,传统消息队列与批处理调…...

无服务器架构与Serverless

无服务器架构与Serverless 1. 技术分析 1.1 无服务器架构概述 无服务器架构是云计算的重要演进&#xff1a; Serverless特点无需管理服务器事件驱动按需付费自动伸缩Serverless服务:FaaS: 函数即服务BaaS: 后端即服务DBaaS: 数据库即服务1.2 FaaS工作原理 FaaS执行流程事件触发…...

为什么你的ChatGPT演讲稿总被说“像机器人”?深度拆解人类共情节奏建模与提示词嵌入技术

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的ChatGPT演讲稿总被说“像机器人”&#xff1f; 当你精心调用 ChatGPT 生成一篇 800 字的 TED 风格演讲稿&#xff0c;满怀期待地朗读给同事听&#xff0c;却收到一句扎心反馈&#xff1a;“很…...

多版本滤波算法对比试验

一、设计版本V1.0资源二、设计版本V2.0资源和仿真三、设计版本V3.0资源和仿真四、设计优化V4.0设计优化V4.0是在V3.0基础上将inline off去掉后&#xff0c;资源立马下降。总结&#xff1a;V1.0版本&#xff0c;很奇怪&#xff0c;按道理&#xff0c;资源要多些&#xff0c;但是…...

企业级多模型聚合平台选型,如何通过用量看板实现成本精细化管理

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业级多模型聚合平台选型&#xff0c;如何通过用量看板实现成本精细化管理 当企业技术团队决定将大模型能力深度融入业务流程时&a…...

终极指南:如何将普通智能音箱改造成AI语音助手

终极指南&#xff1a;如何将普通智能音箱改造成AI语音助手 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 您是否想过&#xff0c;家中那台只会简…...

电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)

电脑里突然冒出的FNPLicensingService.exe是啥&#xff1f;手把手教你关闭它&#xff08;附Adobe/CAD/Xshell等软件排查指南&#xff09;当你打开任务管理器&#xff0c;突然发现一个陌生的进程FNPLicensingService.exe在后台运行&#xff0c;甚至频繁请求联网&#xff0c;这难…...

DeepSeek-R1长上下文实战瓶颈突破:从OOM崩溃到98.7%上下文利用率提升的7步调优流程

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek-R1长上下文处理的核心挑战与价值重定义 DeepSeek-R1在支持长达128K tokens的上下文窗口时&#xff0c;并非仅靠简单扩大KV缓存实现&#xff0c;其核心挑战深植于内存带宽瓶颈、注意力计算复杂度爆炸与…...

终极指南:如何用roop-unleashed三分钟制作专业AI换脸视频

终极指南&#xff1a;如何用roop-unleashed三分钟制作专业AI换脸视频 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 你是否曾梦想过轻松制作专业级的AI换脸…...