C++ STL vector 学习笔记
1. vector 基本概念
vector 是 C++ STL 中最常用的容器之一,它是一个动态数组,能够在运行时自动调整大小。
1.1 特点
- 连续内存存储
- 支持随机访问
- 动态扩容
- 在尾部插入/删除效率高
- 在中间或头部插入/删除效率低
2. 基本操作
2.1.1 声明和初始化
1 2 3 4 5 6 7
| cpp
vector<int> vec; vector<int> vec(5); vector<int> vec(5, 1); vector<int> vec2(vec); vector<int> vec = {1, 2, 3, 4, 5};
|
2.1.2 输入元素
1 2 3 4 5 6 7 8 9
| vector<int> vec; int size; cin>>size; vec.resize(size); for(int i=0;i<size;i++){ int temp; cin>>temp; vec.push_back(temp); }
|
2.1.3 输出元素
1 2 3 4
| vector<int> vec; for(int i=0;i<vec.size();i++){ cout<<vec[i]<<" "; }
|
2.2 常用成员函数
push_back()
: 在尾部添加元素
pop_back()
: 删除尾部元素
size()
: 返回元素个数
capacity()
: 返回当前分配的存储空间
empty()
: 判断是否为空
clear()
: 清空所有元素
reserve()
: 预分配存储空间
resize()
: 改变vector大小
3. 迭代器操作
3.1 基本迭代器
3.1.1 正向迭代器
1 2 3 4 5
| for (vector<int>::iterator it = vtr.begin(); it != vtr.end(); ++it) { cout << *it << " "; }
|
3.1.2 反向迭代器
1 2 3 4 5
| for (vector<int>::reverse_iterator rit = vtr.rbegin(); it != vtr.rend(); ++rit) { cout << *rit << " "; }
|
3.2 常用迭代器函数
begin()
: 返回首元素迭代器
end()
: 返回尾后迭代器
rbegin()
: 返回反向首元素迭代器
rend()
: 返回反向尾后迭代器
4. 内存管理
4.1 扩容机制
- vector在需要更多空间时会自动扩容
- 一般情况下扩容为原来的1.5或2倍
- 扩容会导致迭代器失效
4.2 内存优化
1 2 3
| vector <int> vec; vec.reserve(1000); vec.shrink_to_fit();
|
5. 常见操作示例
5.1 插入和删除
1 2 3 4
| vector <int> vec(1000); vec.insert(vec.begin() + 2, 5); vec.erase(vec.begin() + 2); vec.erase(vec.begin(), vec.begin() + 3);
|
5.2 访问元素
1 2 3 4 5
| vector <int> vec(1000); vec[0]; vec.at(0); vec.front(); vec.back();
|
6. 注意事项
- 避免频繁在中间插入删除元素
- 注意迭代器失效的情况
- 合理使用reserve()预分配空间
- 注意越界访问
7. 性能分析
- 随机访问: O(1)
- 尾部插入/删除: 均摊 O(1)
- 中间插入/删除: O(n)
- 查找: O(n)