vector与array
vector
与 array
的区别
以下是 C++ 中 std::vector
和 std::array
的区别,涵盖定义、特点、性能和使用场景等方面。
1. 定义
- **
std::vector
**:- 动态数组,来自
<vector>
头文件。 - 可以在运行时动态调整大小,支持插入、删除元素。
- 基于堆内存分配,容量不足时自动扩容。
- 动态数组,来自
- **
std::array
**:- 固定大小数组,来自
<array>
头文件(C++11 引入)。 - 封装了 C 风格数组,长度在编译时确定,无法动态改变。
- 通常分配在栈上(或静态存储区)。
- 固定大小数组,来自
2. 主要区别
特性 | std::vector |
std::array |
---|---|---|
大小 | 动态大小,可通过 resize 、push_back 等调整 |
固定大小,编译时确定 |
内存分配 | 堆内存,动态分配 | 栈内存(通常)或静态存储区 |
性能 | 访问速度快,但扩容/重新分配有开销 | 访问速度快,无动态分配开销 |
容量管理 | 支持 capacity 和 reserve ,可预分配空间 |
无容量概念,大小固定 |
接口 | 丰富(如 push_back 、pop_back 、insert ) |
简单(如 at 、size 、迭代器支持) |
边界检查 | at 方法提供边界检查,[] 不检查 |
at 方法提供边界检查,[] 不检查 |
内存开销 | 额外存储大小、容量等元数据 | 无额外开销,仅存储元素 |
初始化 | 支持默认构造、初始化列表、填充等 | 支持初始化列表,需指定大小 |
3. 详细对比
- 大小与容量:
vector
:大小(size
)和容量(capacity
)分离,容量不足时自动扩容(通常翻倍),可能触发内存重新分配。array
:大小固定,编译时由模板参数指定(如std::array<int, 5>
),无法改变。
- 内存管理:
vector
:动态分配在堆上,扩容可能导致数据拷贝,适合动态场景。array
:固定分配在栈上(或静态存储区),内存效率高,适合小规模固定数据。
- 性能:
- 两者访问元素(
[]
或at
)时间复杂度为 ( O(1) )。 vector
的push_back
为平摊 ( O(1) ),但扩容时为 ( O(n) )。array
无动态操作,性能更可预测。
- 两者访问元素(
- 灵活性:
vector
提供动态操作(如插入、删除),适合大小不确定的场景。array
适合大小固定的场景,提供更严格的类型安全和固定内存布局。
- 安全性:
- 两者均支持
at
方法进行边界检查,抛出std::out_of_range
异常。 []
操作符不检查边界,可能导致未定义行为。
- 两者均支持
- 初始化:
vector
:支持多种初始化方式,如std::vector<int> v = {1, 2, 3};
或v.resize(5, 0);
。array
:需指定大小,如std::array<int, 3> a = {1, 2, 3};
,不足部分自动填充默认值(通常为 0)。
4. 代码示例
1 |
|
5. 使用场景
- **
vector
**:- 需要动态调整大小(如列表、缓冲区)。
- 数据量不确定或可能增长。
- 典型场景:动态列表、堆栈、队列的底层实现。
- **
array
**:- 大小固定且已知(如矩阵、配置文件)。
- 追求性能和内存效率。
- 典型场景:小型固定数据集、替换 C 风格数组。
6. 总结
- **
vector
**:动态、灵活,适合大小可变场景,但有内存管理开销。 - **
array
**:固定、轻量,适合大小确定且追求效率的场景。 - 选择时需权衡灵活性与性能,
vector
更通用,array
更高效且安全。
如需更具体的使用场景或优化建议,请提供进一步细节!
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Comments