在 C++ 中,std::vector 是标准库提供的动态数组容器,支持自动扩容、随机访问,是最常用的容器之一。
一、基础用法
1.头文件与命名空间
#include <vector>
using namespace std; //或显示使用 std::vector
2.定义与初始化
// 定义空 vector
vector<int> vec1; // 存储 int 类型的空容器// 初始化为 n 个值为 val 的元素
vector<int> vec2(5, 10); // 5 个元素,每个都是 10 → [10,10,10,10,10]// 用初始化列表初始化(C++11+)
vector<int> vec3 = {1, 2, 3, 4}; // 直接初始化元素 → [1,2,3,4]// 复制另一个 vector
vector<int> vec4(vec3); // 复制 vec3 的内容 → [1,2,3,4]
vector<int> vec5 = vec3; // 同上
二、常用成员函数
1.元素访问
| 函数 | 功能说明 | 示例 |
|---|---|---|
| operator[] | 访问索引 i 处的元素(无越界检查) | vec[2] = 100; |
| at(i) | 访问索引 i 处的元素(有越界检查,抛异常) | int x = vec.at(2); |
| front() | 返回第一个元素 | int first = vec.front(); |
| back() | 返回最后一个元素 | int last = vec.back(); |
| data() | 返回指向底层数组的指针(直接操作内存) | int* ptr = vec.data(); |
2. 容量与大小
| 函数 | 功能说明 | 示例 |
|---|---|---|
| size() | 返回当前元素个数 | int len = vec.size(); |
| empty() | 判断容器是否为空(size() == 0) | if (vec.empty()) |
| capacity() | 返回当前可容纳的最大元素数(未扩容前) | int cap = vec.capacity(); |
| reserve(n) | 预分配至少能容纳 n 个元素的内存(不改变 size) | vec.reserve(100); // 预留空间 |
| resize(n, val) | 调整容器大小为 n,新增元素用 val 填充 | vec.resize(5, 0); // 大小调整为 5 |
3. 元素修改
| 函数 | 功能说明 | 示例 |
|---|---|---|
| push_back(val) | 在尾部添加元素 | vec.push_back(5); |
| pop_back() | 删除尾部元素(不返回值) | vec.pop_back(); |
| insert(pos, val) | 在迭代器 pos 位置插入 | val vec.insert(vec.begin() + 2, 10); |
| erase(pos) | 删除迭代器 pos 位置的元素 | vec.erase(vec.begin() + 1); |
| erase(beg, end) | 删除 [beg, end) 范围内的元素 | vec.erase(vec.begin(), vec.begin()+2); |
| clear() | 清空所有元素(size() 变为 0,capacity 不变) | vec.clear(); |
| swap(vec2) | 与另一个 vector 交换内容(高效,常数时间) | vec.swap(vec2); |
4. 迭代器(遍历用)
| 函数 | 功能说明 | 示例 |
|---|---|---|
| begin() | 返回指向第一个元素的迭代器 | for (auto it = vec.begin(); it != vec.end(); ++it) |
| end() | 返回指向最后一个元素后一位的迭代器 | 同上(作为循环结束条件) |
| rbegin() | 返回指向最后一个元素的反向迭代器 | for (auto it = vec.rbegin(); it != vec.rend(); ++it) |
| rend() | 返回指向第一个元素前一位的反向迭代器 | 同上(反向遍历) |
三、遍历 vector 的几种方式
vector<int> vec = {1, 2, 3, 4, 5};// 1. 下标遍历(适合随机访问)
for (int i = 0; i < vec.size(); ++i) {cout << vec[i] << " ";
}// 2. 迭代器遍历(最通用,支持所有容器)
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {cout << *it << " ";
}// 3. 范围 for 循环(C++11+,简洁)
for (int x : vec) {cout << x << " ";
}// 4. 反向遍历
for (vector<int>::reverse_iterator it = vec.rbegin(); it != vec.rend(); ++it) {cout << *it << " "; // 输出:5 4 3 2 1
}
四、注意事项
1.动态扩容:当 size() == capacity() 时,push_back 会触发扩容(通常是翻倍分配新内存,复制旧元素,释放旧内存),效率较低。提前用 reserve(n) 预留空间可避免频繁扩容。
2.越界访问:operator[] 不检查越界,越界访问会导致未定义行为;at() 会检查越界并抛出 out_of_range 异常,更安全但略慢。
3.内存管理:vector 会自动释放内存,无需手动管理,但 clear() 不会释放已分配的内存(仅清空元素),若需释放内存可配合 swap:
vector<int>().swap(vec); // 交换一个临时空 vector,触发内存释放
五、示例:综合使用
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec;// 添加元素vec.push_back(10);vec.push_back(20);vec.push_back(30);// 插入元素vec.insert(vec.begin() + 1, 15); // 在索引1处插入15 → [10,15,20,30]// 遍历输出cout << "元素: ";for (int x : vec) {cout << x << " "; // 输出:10 15 20 30}// 修改元素vec[2] = 25; // → [10,15,25,30]// 容量信息cout << "\nsize: " << vec.size() // 4<< ", capacity: " << vec.capacity() << endl; // 通常为4或8(取决于实现)// 删除元素vec.erase(vec.end() - 1); // 删除最后一个元素 → [10,15,25]return 0;
}
