1. 什么是 std::vector
?
std::vector
是 C++ STL 提供的动态数组容器,可以动态调整大小并存储任意类型的元素。
与普通数组相比,std::vector
更加灵活,提供了丰富的操作接口。
2. 基本特性
- 动态大小:支持在运行时动态增加或减少大小,自动管理内存。
- 连续存储:元素在内存中是连续存储的,支持随机访问。
- 时间复杂度:
- 随机访问:( O(1) )。
- 插入/删除:
- 尾部操作:( O(1) )。
- 中间或前部操作:( O(n) )(需要移动元素)。
- 自动内存管理:动态分配和释放内存,不需要手动操作。
- 迭代器支持:支持 STL 风格的迭代器,方便遍历和操作。
3. 常用函数
3.1 元素访问
函数 | 功能说明 |
---|---|
at(index) | 返回指定索引的元素,带边界检查。 |
operator[index] | 返回指定索引的元素,不进行边界检查。 |
front() | 返回第一个元素。 |
back() | 返回最后一个元素。 |
data() | 返回指向底层数组的指针。 |
3.2 容量操作
函数 | 功能说明 |
---|---|
size() | 返回当前元素数量。 |
capacity() | 返回当前分配的存储容量。 |
empty() | 判断是否为空。 |
resize(n, val) | 调整大小为 n ,多余部分用 val 填充,默认值为 0 。 |
reserve(n) | 增加存储容量至至少 n (不会改变元素数量)。 |
shrink_to_fit() | 释放未使用的内存,调整容量以适应当前大小。 |
3.3 修改操作
函数 | 功能说明 |
---|---|
push_back(val) | 在尾部添加一个元素。 |
pop_back() | 移除尾部元素。 |
insert(pos, val) | 在迭代器 pos 指定位置插入元素 val 。 |
erase(pos) | 删除迭代器 pos 指向的元素。 |
clear() | 清空所有元素。 |
assign(n, val) | 将容器填充为 n 个 val 。 |
emplace_back(args) | 在尾部直接构造元素(避免拷贝,提高性能)。 |
4. 示例代码
4.1 基本使用
#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums;// 添加元素nums.push_back(10);nums.push_back(20);nums.push_back(30);// 遍历元素for (int i = 0; i < nums.size(); i++) {cout << nums[i] << " ";}cout << endl;// 删除尾部元素nums.pop_back();// 使用迭代器遍历for (auto it = nums.begin(); it != nums.end(); ++it) {cout << *it << " ";}cout << endl;return 0;
}
输出:
10 20 30
10 20
4.2 动态调整大小
#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums(5, 1); // 初始化大小为 5,每个元素值为 1cout << "Initial size: " << nums.size() << endl;nums.resize(8, 2); // 调整大小为 8,新增元素值为 2for (auto num : nums) {cout << num << " ";}cout << endl;nums.shrink_to_fit(); // 调整容量以匹配大小cout << "Size after shrinking: " << nums.size() << endl;return 0;
}
输出:
Initial size: 5
1 1 1 1 1 2 2 2
Size after shrinking: 8
4.3 插入和删除元素
#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums = {10, 20, 30, 40};// 插入元素nums.insert(nums.begin() + 2, 25); // 在第三个位置插入 25// 删除元素nums.erase(nums.begin()); // 删除第一个元素for (auto num : nums) {cout << num << " ";}return 0;
}
输出:
20 25 30 40
5. 注意事项
- 随机访问性能优越:由于
std::vector
的底层是动态数组,支持通过索引直接访问元素,性能为 ( O(1) )。 - 插入和删除:在尾部操作效率高,复杂度为 ( O(1) );在中间或前部操作可能需要移动大量元素,复杂度为 ( O(n) )。
- 容量管理:
- 容量
capacity
通常大于或等于当前大小size
。 - 使用
reserve()
可以预先分配内存,减少动态扩展的次数。
- 容量
- 迭代器失效:
- 动态扩展或删除元素时,可能会导致迭代器失效。
- 内存使用:
shrink_to_fit()
可释放未使用的内存。
6. 应用场景
6.1 动态数组
当数组大小在运行时需要动态变化时,使用 std::vector
更加合适。
#include <vector>
#include <iostream>
using namespace std;int main() {int n;cin >> n;vector<int> nums;for (int i = 0; i < n; i++) {nums.push_back(i);}for (auto num : nums) {cout << num << " ";}return 0;
}
6.2 多维数组
通过嵌套 std::vector
创建动态二维数组。
#include <vector>
#include <iostream>
using namespace std;int main() {int rows = 3, cols = 4;vector<vector<int>> matrix(rows, vector<int>(cols, 0));// 修改元素matrix[1][2] = 5;// 输出矩阵for (auto& row : matrix) {for (auto& elem : row) {cout << elem << " ";}cout << endl;}return 0;
}
输出:
0 0 0 0
0 0 5 0
0 0 0 0
7. 总结表
特性 | 说明 |
---|---|
动态大小 | 支持动态增删元素,内存由容器管理。 |
连续存储 | 元素在内存中是连续存储,适合随机访问。 |
操作效率 | 随机访问为 ( O(1) ),尾部插入/删除为 ( O(1) )。 |
插入/删除限制 | 中间或前部插入/删除效率低,可能导致大量元素移动。 |
多维支持 | 可以嵌套 std::vector ,实现动态二维/三维数组。 |
迭代器支持 | 支持 STL 风格迭代器,方便遍历和操作。 |