C++ STL 中的 Vector
vector 是标准模板库(STL)中的一种动态数组 ,当元素数量超过当前容量时会自动扩容。
程序员无需手动管理容量或提前分配额外空间。但在某些插入/删除操作时,由于内部会按预设阈值重新分配内存,时间开销可能略高。若这些操作对时间极其敏感,建议改用普通数组。
vector 支持边界检查:可用 v.at(i) 访问向量 v 中索引为 i 的元素。
vector 的声明与初始化
vector 在头文件 <vector> 中以类模板 std::vector 的形式定义。
cpp
vector<T> v;
其中 T 表示元素的数据类型,v 是给该 vector 起的名字。
vector 常用操作
C++ 中的 vector 提供了多种实用操作,可动态地添加、删除、访问和修改元素(增删改查)。
1.插入元素
-
push_back(value):在 vector 末尾 插入元素,效率很高。平均时间复杂度为 O(1),速度非常快。 -
insert(position, value):在任意位置 (开头、中间、末尾)插入元素。由于需要移动后续元素,时间复杂度为 O(n)。
示例代码
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<char> v = {'a', 'f', 'd'};
// 在末尾插入 'z'
v.push_back('z');
// 在索引 1 处插入 'c'
v.insert(v.begin() + 1, 'c');
for (int i = 0; i < v.size(); i++){
cout << v[i] << " ";
}
return 0;
}
css
a c f d z
2.访问元素
可以用 v[i] 直接访问,或用 v.at(i) 做带边界检查的访问。两者都返回索引 i 处的元素,但如果 i 越界,at(i) 会抛出异常。 操作平均耗时 O(1),速度极快。
示例代码
cpp
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = {10, 20, 30, 40};
// 使用 operator[] 访问
cout << "用 [] 访问索引 2 的元素: " << v[2] << endl;
// 使用 at() 访问
cout << "用 at() 访问索引 3 的元素: " << v.at(3) << endl;
// 取消下一行注释将抛出 out_of_range 异常
// cout << v.at(10) << endl;
return 0;
}
css
用 [] 访问索引 2 的元素: 30
用 at() 访问索引 3 的元素: 40
3.更新元素
只需通过索引使用赋值运算符即可更新元素,例如 v[i] = newValue;
这会把索引 i 处的旧元素替换成新值。
示例代码
cpp
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = {10, 20, 30};
cout << "索引 1 的原值: " << v[1] << endl;
// 更新索引 1 的元素
v[1] = 50;
cout << "索引 1 的新值: " << v[1] << endl;
return 0;
}
索引 1 的原值: 20
索引 1 的新值: 50
4.获取 vector 长度
使用 size() 函数即可得到 vector 当前存储的元素个数,例如 v.size()。
示例代码
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<char> v = {'a', 'c', 'f', 'd', 'z'};
// 获取元素个数
cout << v.size();
return 0;
}
5
5.遍历 vector
遍历 vector 就是逐个访问每个元素,通常用循环实现。 可用下标 for 循环 (v[i])、范围 for 循环 (for (int x : v)) 或迭代器。 时间复杂度为 O(n)。
示例代码
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<char> v = {'a', 'c', 'f', 'd', 'z'};
// 用下标 for 循环遍历
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
return 0;
}
css
a c f d z
6.删除元素
可用 erase() 删除 vector 中的元素,它需要一个指向该元素的迭代器。
由于后续元素都要前移,时间复杂度为 O(n) 。 若只需删除末尾元素 ,用 pop_back() 即可,平均 O(1),速度极快。
示例代码
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<char> v = {'a', 'c', 'f', 'd', 'z'};
// 删除末尾元素 'z'
v.pop_back();
// 删除元素 'f'
v.erase(find(v.begin(), v.end(), 'f'));
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
return 0;
}
css
a c d
7.判断 vector 是否为空
使用 empty() 函数即可检查 vector 是否含有元素。
若为空返回 true,否则返回 false。
在访问或修改 vector 前先进行此检查,可避免错误。
示例代码
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
// 检查 vector 是否为空
if (v.empty()) {
cout << "Vector 为空。" << endl;
}
// 添加一个元素
v.push_back(100);
if (!v.empty()) {
cout << "Vector 非空。首元素为 " << v[0] << endl;
}
return 0;
}
Vector 为空。
Vector 非空。首元素为 100
多维 vector
多维 vector 是可在多个维度存储数据的动态数组,类似表格或网格。
通过"vector 里再放 vector"实现,可灵活构造行-列(二维)甚至更高维结构。
二维 vector 声明
cpp
vector<vector<int>> matrix;
二维 vector 初始化
cpp
// 直接赋初值
vector<vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 3 行 4 列,全部初始化为 0
vector<vector<int>> matrix(3, vector<int>(4, 0));
访问二维 vector 元素
使用双下标即可:
cpp
// 输出 6
cout << matrix[1][2];
遍历二维 vector
示例代码
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
cout << "用下标循环遍历二维 vector:\n";
// 用双重下标 for 循环遍历
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
return 0;
}
arduino
用下标循环遍历二维 vector:
1 2 3
4 5 6
7 8 9