好的!以下是关于C++中vector容器的详细指南:
一、vector基础
vector是C++标准模板库(STL)提供的动态数组,支持自动扩容和随机访问。其核心特性包括:
- 连续内存存储:元素在内存中连续分布,支持指针算术。
- 动态大小:无需预先指定长度,可运行时调整。
- 时间复杂度 :
- 随机访问:O(1)
- 尾部插入/删除:均摊O(1)
- 中间插入/删除:O(n)
二、基本操作
1. 初始化
cpp
#include <vector>
using namespace std;
// 空vector
vector<int> vec1;
// 指定长度和初始值
vector<int> vec2(5, 0); // {0, 0, 0, 0, 0}
// 从数组初始化
int arr[] = {1, 2, 3};
vector<int> vec3(arr, arr + 3); // {1, 2, 3}
// 列表初始化(C++11)
vector<int> vec4 = {4, 5, 6};
2. 常用方法
| 方法 | 功能 | 示例 |
|---|---|---|
push_back() |
尾部添加元素 | vec.push_back(10); |
pop_back() |
删除尾部元素 | vec.pop_back(); |
size() |
返回元素数量 | int len = vec.size(); |
empty() |
判断是否为空 | if (vec.empty()) {...} |
clear() |
清空所有元素 | vec.clear(); |
resize(n) |
调整容器大小 | vec.resize(10); |
三、内存管理与性能
1. 扩容机制
-
当容量不足时,
vector会分配新内存(通常为原大小的2倍),复制元素并释放旧内存。 -
可通过
capacity()查看当前容量:cppvector<int> vec; cout << "Capacity: " << vec.capacity(); // 初始为0 vec.push_back(1); // 容量变为1
2. 预分配内存
使用reserve()避免频繁扩容:
cpp
vector<int> vec;
vec.reserve(100); // 预分配100个元素空间
// 后续插入100个元素不会触发扩容
四、迭代器与访问
1. 迭代器遍历
cpp
vector<int> vec = {10, 20, 30};
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " "; // 10 20 30
}
2. 随机访问
cpp
cout << vec[0]; // 索引访问(不检查边界)
cout << vec.at(1); // 边界检查访问,越界抛出异常
五、高效操作技巧
1. 使用emplace_back替代push_back
-
emplace_back直接构造元素,避免临时对象拷贝:cppvector<pair<int, string>> vec; vec.emplace_back(1, "Alice"); // 直接构造pair
2. 避免在循环中插入
以下操作可能多次触发扩容:
cpp
// 低效写法
for (int i = 0; i < 10000; i++) {
vec.push_back(i); // 可能多次扩容
}
// 高效写法
vec.reserve(10000);
for (int i = 0; i < 10000; i++) {
vec.push_back(i);
}
六、删除元素
1. erase方法
删除指定位置元素:
cpp
vector<int> vec = {1, 2, 3, 4};
auto it = vec.begin() + 2;
vec.erase(it); // 删除第三个元素(索引2)
2. 删除特定值(erase + remove)
cpp
vector<int> vec = {1, 2, 2, 3, 4};
vec.erase(remove(vec.begin(), vec.end(), 2), vec.end());
// 结果:{1, 3, 4}
七、应用场景
- 替代原生数组:更安全、功能更强。
- 动态数据集合:如实时接收传感器数据。
- 算法实现:如图论中的邻接表存储。
八、注意事项
- 迭代器失效:插入/删除操作可能使迭代器失效。
- 线程安全:多线程环境下需自行加锁。
- 存储大对象 :建议存储指针或使用
std::move转移所有权。
通过灵活运用vector,可显著提升C++程序的开发效率和性能。