vector、std::array 与 C 数组的比较
比较这三种顺序容器,并根据大小、所有权和性能进行选择
vector、std::array 与 C 数组的比较 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
三种顺序容器
C++ 有三种方式用于存储连续序列:
- std::vector — 大小可变,使用堆存储
- std::array — 编译时固定大小,使用栈存储
- C 风格数组 — 大小固定,属于底层结构
C 风格数组
这是最早出现的形式。大小是类型的一部分。传递给函数时会退化为 pointer,从而丢失大小信息。
int a[5] = {1, 2, 3, 4, 5};
std::cout << a[2]; // 3C 风格数组的问题
在大多数上下文中,它们会忘记自己的大小,不会进行边界检查,而且很容易被误用。在新代码中,请优先使用 std::array 或 std::vector。
std::array(C++11)
这是对固定大小数组的轻量封装。它与 C 数组具有相同的性能,但拥有真正的类型和适当的成员函数。
#include <array>
std::array<int, 5> a = {1, 2, 3, 4, 5};
std::cout << a.size(); // 5
std::cout << a.at(2); // bounds-checkedstd::array 保持在栈上
与 vector 不同,std::array 直接存储其元素,不会进行堆分配。大小是模板参数。
用于动态大小的 std::vector
当您在编译时不知道大小,或者大小会在运行时改变时,请使用 std::vector。
性能比较
对于固定大小,三者的性能都相近。std::vector 需要额外承担少量的指针和大小记录开销,以及一次间接寻址。
传递给函数
请通过 const 引用传递 vector 或 std::array,以避免复制。借用 C 数组时,应使用 std::span(C++20)替代它们。
void process(const std::vector<int>& v);
void process(const std::array<int, 5>& a);
#include <span>
void process(std::span<const int> data); // accepts bothstd::span(C++20)
这是对连续序列的非拥有视图,类似于指针和长度组成的二元组。它可以统一接受 vector、std::array 和 C 数组。
何时选择哪一种
决策树:
- 需要动态大小 →
std::vector - 大小固定且不进行分配 →
std::array - 借用而不取得所有权 →
std::span - 需要与 C 代码互操作 → C 数组
它们之间的转换
您可以使用范围或算法在不同类型之间复制元素。
std::array<int, 3> a = {1, 2, 3};
std::vector<int> v(a.begin(), a.end());
int c[3];
std::copy(a.begin(), a.end(), c);快速检查
哪种容器将元素存储在栈上,并且大小在编译时已知?
回顾
动态大小时优先使用 std::vector,固定大小时使用 std::array。在现代代码中,C 风格数组很少是最佳选择。请使用 std::span 在不取得所有权的情况下借用序列。
常见问题解答
「vector、std::array 与 C 数组的比较」课时是免费的吗?
是的 — 「vector、std::array 与 C 数组的比较」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「vector、std::array 与 C 数组的比较」这节课中我会学到什么?
比较这三种顺序容器,并根据大小、所有权和性能进行选择 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「vector、std::array 与 C 数组的比较」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- std::vector 基础:push_back、size、capacity
- 遍历向量:索引、范围 for、迭代器
- 修改向量:insert、erase、clear
- vector、std::array 与 C 数组的比较