array
和 vector
是 C++ 中常用的两种容器。以下是它们的主要区别:
特性 | array | vector |
---|---|---|
大小 | 固定大小,编译时确定 | 动态大小,可在运行时调整 |
内存管理 | 栈上分配,固定内存 | 堆上分配,可动态分配和调整 |
灵活性 | 不可调整大小,较为固定 | 可调整大小,支持插入和删除元素 |
初始化 | 直接初始化 | 多种方式(默认、指定大小、列表等) |
性能 | 性能较高(无动态开销) | 较小的动态调整开销 |
标准库支持 | C++11 引入 std::array | C++ 标准模板库(STL)的一部分 |
迭代器支持 | 原生数组不支持,std::array 支持 | 完全支持 STL 迭代器 |
1. 时间复杂度与空间复杂度
- array:
- 访问元素: O(1)
- 插入/删除元素: 不支持动态调整
- 大小调整: 不支持
- 空间复杂度: O(n)(n 为数组大小)
- vector:
- 访问元素: O(1)
- 插入尾部: O(1) 均摊
- 插入其他位置: O(n)
- 大小调整: O(n)
- 空间复杂度: O(n)(取决于元素个数和预留空间)
2. 底层原理
- array:
- 连续的内存块,大小固定,编译时确定。
- 访问元素时间复杂度为 O(1)。
- 不支持运行时大小调整。
- vector:
- 动态数组,使用连续内存块,支持动态内存管理。
- 自动扩容(通常容量加倍),尾部插入均摊时间复杂度为 O(1)。
- 动态调整大小时,会有额外的内存开销。
3. 初始化方式
- array:
- 原生 C++ 数组:
int arr[5] = {1, 2, 3, 4, 5};
- std::array (C++11 引入):
std::array<int, 5> arr = {1, 2, 3, 4, 5};
- vector:
- 默认构造:
std::vector<int> vec;
- 指定大小:
std::vector<int> vec(5, 0);
- 列表初始化:
std::vector<int> vec = {1, 2, 3};
4. 常用接口
- array:
- 访问元素:
int x = arr[2];
- 获取大小 (std::array):
size_t size = arr.size();
- std::array 特有方法:
arr.fill(0);
- vector:
- 访问元素:
int x = vec[2];
int y = vec.at(2);
- 添加元素:
vec.push_back(6);
- 删除元素:
vec.pop_back();
vec.erase(vec.begin() + 2);
- 获取大小和容量:
size_t size = vec.size();
size_t capacity = vec.capacity();
- 改变大小:
vec.resize(10);
总结
- array 适用于大小固定、元素个数已知且不需要动态调整的场景,具有简单、快速的特点。
- vector 适用于需要动态调整大小、插入和删除元素的场景,提供了更灵活的接口和功能,但也带来了额外的内存管理开销。