C++ STL入门:vecto容器
C++ STL 系列入门:vector 动态数组
一、vector 容器核心特性
vector
是 C++ 标准库提供的动态数组容器,具有以下显著优势:
- 自动扩容机制:当插入元素超出当前容量时,自动申请新内存并迁移数据
- 随机访问效率:支持 O(1) 时间复杂度的下标访问
- 与原生数组兼容:通过
data()
方法可获取指向底层存储的指针
#include <iostream>
#include <vector>
using namespace std;int main() {// 基础操作演示vector<int> v;
二、容器初始化与容量管理
1. 构造方式对比
// 默认构造:空容器vector<int> v1; // 指定大小构造(元素默认初始化)vector<int> v2(10); // 指定大小+初始值构造vector<int> v3(10, 2); // 10个值为2的元素// 迭代器区间构造(可用于复制其他容器)vector<int> v4(v3.begin(), v3.end());
2. 容量操作函数
v.resize(10); // 调整元素数量:若增大则填充默认值cout << "当前元素数:" << v.size() << endl; // 输出10cout << "当前存储容量:" << v.capacity() << endl; // 容量≥size()v.reserve(20); // 显式预留存储空间(避免多次扩容)
扩容机制解析:
当未显式预留空间时,vector 扩容策略通常是当前容量的两倍。例如初始容量5,push_back第6个元素时,容器会重新分配10个元素的内存空间。
三、元素访问与修改
1. 下标访问 vs 迭代器访问
// 下标赋值for(int i=0; i<10; i++) {v[i] = i+1; // 支持[]运算符随机访问}// 迭代器遍历(STL标准方式)for(auto it = v.begin(); it != v.end(); ++it) {cout << *it << " "; // 解引用访问元素}
2. 尾部插入操作
v.push_back(11); // 尾插新元素cout << "扩容后元素数:" << v.size() << endl; // 输出11cout << "扩容后存储容量:" << v.capacity() << endl; // 可能输出20
3. 边界安全访问
if(!v.empty()) {cout << "首元素:" << v.front() << endl; // front()cout << "末元素:" << v.back() << endl; // back()}
四、常见操作时间复杂度分析
操作 | 时间复杂度 | 特性说明 |
---|---|---|
push_back() | 摊销 O(1) | 扩容时 O(n) |
pop_back() | O(1) | 仅移除不减小容量 |
insert() | O(n) | 中间插入需移动元素 |
erase() | O(n) | 删除后需收缩元素 |
operator[] | O(1) | 无边界检查 |
at() | O(1) | 带边界检查抛出异常 |
五、典型应用场景
1. 动态数据存储
vector<int> nums;
int input;
while(cin >> input) {nums.push_back(input); // 自动扩展存储空间
}
2. 算法中间结果保存
// 寻找数组中消失的数字(LeetCode 448)
vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int> result;// 算法实现...return result;
}
3. 二维矩阵构造
int m = 3, n = 4;
vector<vector<int>> matrix(m, vector<int>(n, 0)); // 创建3×4矩阵
六、易错点与优化建议
- 迭代器失效问题
auto it = v.begin();
v.push_back(100); // 可能触发扩容,导致it失效!
// 正确做法:先执行插入操作再获取迭代器
- 避免频繁扩容
vector<int> data;
data.reserve(1000); // 预留空间提升性能
for(int i=0; i<1000; i++) {data.push_back(i);
}
- 空间释放陷阱
vector<int>(v).swap(v); // 缩小至实际大小
七、延伸知识点
shrink_to_fit()
:请求删除未使用容量(C++11)emplace_back()
:原地构造元素(避免拷贝)data()
方法:获取底层数据指针用于接口交互
配套练习项目:
LeetCode 数组系列题目
CppReference vector文档