一、基础用法
1. 头文件与命名空间
#include <vector> // 必须包含的头文件
using namespace std; // 可选,避免重复写 std::
2. 定义与初始化
// ① 空 vector
vector<int> v1; // 存储 int 的空 vector
// ② 指定大小(元素默认初始化,int 为 0,自定义类型调用默认构造)
vector<int> v2(5); // 大小为 5 的 vector,元素均为 0
vector<string> v3(3); // 3 个空字符串
// ③ 指定大小 + 初始值
vector<int> v4(4, 10); // 4 个元素,均为 10 → [10,10,10,10]
// ④ 用初始化列表(C++11+)
vector<int> v5 = {1, 2, 3, 4}; // 直接初始化元素 → [1,2,3,4]
vector<int> v6{5,6,7}; // 同上(省略 =)
// ⑤ 复制初始化(拷贝另一个 vector)
vector<int> v7(v5); // 复制 v5 的元素 → [1,2,3,4]
vector<int> v8 = v6; // 同上
// ⑥ 范围初始化(拷贝迭代器范围内的元素)
vector<int> v9(v5.begin(), v5.end()); // 拷贝 v5 全部元素
vector<int> v10(v5.begin()+1, v5.end()-1); // 拷贝 [2,3]
二、元素访问
vector 支持随机访问(时间复杂度 O (1)),常用访问方式:
1. 下标访问([])
vector<int> v = {10, 20, 30};
cout << v[0]; // 10(不检查越界,越界会导致未定义行为)
v[1] = 200; // 修改元素 → [10,200,30]
2. at() 方法(带越界检查)
cout << v.at(2); // 30(越界时抛出 out_of_range 异常,更安全)
v.at(0) = 100; // 修改元素 → [100,200,30]
3. 访问首尾元素
cout << v.front(); // 第一个元素(100)
cout << v.back(); // 最后一个元素(30)
4. 数据指针(data())
返回指向底层数组的指针,可用于兼容 C 风格函数:
int* p = v.data(); // p 指向 v 的第一个元素
cout << p[1]; // 200(等价于 v[1])
三、添加元素
vector 动态扩容,常用添加元素的方法:
1. 尾部添加(push_back())
在 vector 末尾插入元素(平均时间复杂度 O (1)):
vector<int> v;
v.push_back(1); // [1]
v.push_back(2); // [1,2]
v.push_back(3); // [1,2,3]
2. 插入元素(insert())
在指定位置插入元素(时间复杂度 O (n),需移动后续元素):
vector<int> v = {1, 2, 3};
// ① 在迭代器位置插入单个元素
v.insert(v.begin() + 1, 10); // 在索引 1 处插入 10 → [1,10,2,3]
// ② 插入多个相同元素
v.insert(v.end(), 2, 0); // 在末尾插入 2 个 0 → [1,10,2,3,0,0]
// ③ 插入另一个容器的范围
vector<int> temp = {4,5};
v.insert(v.begin(), temp.begin(), temp.end()); // 在开头插入 4,5 → [4,5,1,10,2,3,0,0]
3. emplace 系列(C++11+,更高效)
emplace_back() 和 emplace() 直接在容器中构造元素(避免拷贝,比 push_back/insert 更高效):
vector<pair<int, string>> vp;
// emplace_back 直接构造 pair(参数传递给构造函数)
vp.emplace_back(1, "one"); // 等价于 vp.push_back(pair<int,string>(1, "one"))
四、删除元素
1. 尾部删除(pop_back())
删除最后一个元素(时间复杂度 O (1)):
vector<int> v = {1,2,3};
v.pop_back(); // 删除 3 → [1,2]
2. 指定位置删除(erase())
删除迭代器指向的元素,或范围元素(时间复杂度 O (n)):
vector<int> v = {1,2,3,4,5};
// ① 删除单个元素(迭代器位置)
v.erase(v.begin() + 2); // 删除索引 2 的元素(3)→ [1,2,4,5]
// ② 删除范围元素([begin, end))
v.erase(v.begin(), v.begin() + 2); // 删除前 2 个元素 → [4,5]
3. 清空所有元素(clear())
删除所有元素(大小变为 0,但容量可能保留):
v.clear(); // 元素清空,size() 为 0,capacity() 不变
五、容量与大小管理
vector 有两个关键属性:
size():当前元素个数。
capacity():当前可容纳的最大元素个数(底层数组大小)。
1. 查看大小与容量
vector<int> v = {1,2,3};
cout << v.size(); // 3(元素个数)
cout << v.capacity(); // 至少为 3(取决于实现,可能更大)
2. 调整大小(resize())
改变元素个数(若增大,新增元素默认初始化或指定值):
v.resize(5); // 大小变为 5,新增元素为 0 → [1,2,3,0,0]
v.resize(2); // 大小变为 2,删除后面的元素 → [1,2]
v.resize(4, 10); // 大小变为 4,新增元素为 10 → [1,2,10,10]
3. 预留容量(reserve())
提前分配底层内存(避免频繁扩容,提升性能):
vector<int> v;
v.reserve(100); // 容量至少为 100(size() 仍为 0)
// 后续添加 100 个元素时,不会触发扩容
4. 收缩容量(shrink_to_fit(),C++11+)
将容量缩减至与大小一致(释放多余内存):
vector<int> v(100);
v.resize(10);
v.shrink_to_fit(); // capacity() 变为 10
六、遍历 vector
1. 下标遍历
for (int i = 0; i < v.size(); ++i) {cout << v[i] << " ";
}
2. 迭代器遍历
// 正向迭代器
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {cout << *it << " ";
}
// 反向迭代器(从后往前)
for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit) {cout << *rit << " ";
}
3. 范围 for 循环(C++11+,推荐)
for (int num : v) { // 只读遍历cout << num << " ";
}
for (int& num : v) { // 引用遍历(可修改元素)num *= 2;
}
七、其他常用操作
1. 交换两个 vector(swap())
交换两个 vector 的元素(时间复杂度 O (1),仅交换底层指针):
vector<int> v1 = {1,2};
vector<int> v2 = {3,4,5};
v1.swap(v2); // v1 变为 {3,4,5},v2 变为 {1,2}
2. 检查是否为空(empty())
if (v.empty()) {cout << "vector is empty";
}
3. 排序(配合 )
#include <algorithm>
vector<int> v = {3,1,4};
sort(v.begin(), v.end()); // 升序 → [1,3,4]
sort(v.rbegin(), v.rend()); // 降序 → [4,3,1]