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

当初自学 c++ 与 c 语言时,一直被指针弄的云里雾里。后来 c++ 中引入了容器,避免了指针。但是,一些教材把容器的章节放在书本中后面的章节,太不合理。应该把这种方便的功能放到前面,这样一些初学者就不会遇到太多生硬难懂的知识点从而对这个语言望而却步了。这篇博客让 AI 总结了相关知识点,方便自己以后查阅。

总结:

  • 对于定长数组,用 array
  • 不定长数组,用 vector
  • 计算规模巨大,实在想优化计算速度,用指针

文章目录

  • [一、 **C++ 中的 `std::vector`**](#一、 C++ 中的 std::vector)
    • [**1. `std::vector` 基本使用**](#1. std::vector 基本使用)
      • [**(1) 引入 `<vector>` 头文件**](#(1) 引入 <vector> 头文件)
    • [**2. `std::vector` 的核心方法**](#2. std::vector 的核心方法)
    • [**3. `vector` 详细示例**](#3. vector 详细示例)
      • [**(1) 创建和初始化**](#(1) 创建和初始化)
      • [**(2) `push_back()` 和 `pop_back()`**](#(2) push_back() 和 pop_back())
      • [**(3) `insert()` 和 `erase()`**](#(3) insert() 和 erase())
    • [**4. `vector` 与普通数组的对比**](#4. vector 与普通数组的对比)
    • [**5. 总结**](#5. 总结)
  • [二、 **C++ 中的 `std::array`**](#二、 C++ 中的 std::array)
    • [**1. `std::array` 的特点**](#1. std::array 的特点)
    • [**2. `std::array` 的基本用法**](#2. std::array 的基本用法)
      • [**(1) 创建与初始化**](#(1) 创建与初始化)
    • [**3. `std::array` 的常用方法**](#3. std::array 的常用方法)
    • [**4. `std::array` 方法示例**](#4. std::array 方法示例)
    • [**5. `std::array` 与 C 风格数组的对比**](#5. std::array 与 C 风格数组的对比)
    • [**6. `std::array` 在 STL 算法中的使用**](#6. std::array 在 STL 算法中的使用)
    • [**7. 总结**](#7. 总结)

一、 C++ 中的 std::vector

在 C++ 中,std::vector 是 动态数组容器 ,提供了自动扩展、随机访问 等功能,是 std::array 和 std::list 之间的高效选择。

std::vector 定义在 <vector> 头文件中,属于 STL(标准模板库) 的一部分。


1. std::vector 基本使用

(1) 引入 <vector> 头文件

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    // 遍历 vector
    for (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) 创建和初始化

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v1;                   // 空 vector
    std::vector<int> v2(5, 100);           // 5 个 100
    std::vector<int> v3 = {10, 20, 30};    // 列表初始化
    std::vector<int> v4(v3);               // 复制 v3
    std::vector<int> v5(v3.begin(), v3.end()); // 迭代器初始化

    for (int x : v2) std::cout << x << " "; // 输出: 100 100 100 100 100
}

(2) push_back() 和 pop_back()

cpp 复制代码
#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;  // 3
    std::cout << "Last Element: " << v.back() << std::endl;  // 3

    v.pop_back();  // 删除 3

    std::cout << "Size after pop: " << v.size() << std::endl;  // 2
}

输出:

复制代码
Size: 3
Last Element: 3
Size after pop: 2

(3) insert() 和 erase()

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    v.insert(v.begin() + 2, 99); // 在索引 2 位置插入 99
    v.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) 创建与初始化

cpp 复制代码
#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr1 = {1, 2, 3, 4, 5};  // 列表初始化
    std::array<int, 5> arr2 = {0};             // 仅初始化第一个元素为 0,其余为 0
    std::array<int, 5> arr3{};                 // 全部初始化为 0

    for (int num : arr1) std::cout << num << " "; // 1 2 3 4 5
    return 0;
}

3. std::array 的常用方法

方法 作用
size() 返回数组大小(固定值 N)。
at(index) 获取指定索引的元素(带边界检查)。
operator[] 获取指定索引的元素(不带边界检查)。
front() 获取第一个元素。
back() 获取最后一个元素。
fill(value) 将所有元素设置为 value。
swap(other) 交换两个 std::array 的内容。
data() 返回指向底层数组的指针。

4. std::array 方法示例

cpp 复制代码
#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {10, 20, 30, 40, 50};

    std::cout << "Size: " << arr.size() << std::endl;  // 5
    std::cout << "First: " << arr.front() << std::endl;  // 10
    std::cout << "Last: " << arr.back() << std::endl;  // 50

    arr.fill(100);  // 全部赋值为 100
    for (int x : arr) std::cout << x << " ";  // 100 100 100 100 100

    return 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 算法中的使用

cpp 复制代码
#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 还有其他问题吗?

相关推荐
沫璃染墨23 分钟前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
旖旎夜光3 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
小超人诞生日记3 小时前
C++ 智能指针的使用及其原理详解
c++·算法
akinggw4 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
miaobinfei5 小时前
docker拉取dify镜像,执行docker compose up -d 报错
运维·docker·容器
繁星蓝雨5 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
kobe_OKOK_6 小时前
docker compose命名卷 映射到宿主机的路径
运维·docker·容器
旖旎夜光6 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
扶尔魔ocy7 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件