C/C++
关键字
STL vector
`std::vector` 是 C++ 标准模板库(STL)中最常用的动态数组容器,提供高效的随机访问和动态内存管理。以下是详细用法指南:
---
### **1. 基本操作**
#### **包含头文件**
```cpp
#include <vector>
声明与初始化
// 空vector
std::vector<int> vec1;
// 指定大小(5个0)
std::vector<int> vec2(5);
// 指定大小和初始值(5个10)
std::vector<int> vec3(5, 10);
// 列表初始化
std::vector<int> vec4 = {1, 2, 3, 4, 5};
// 从数组初始化
int arr[] = {6, 7, 8};
std::vector<int> vec5(arr, arr + sizeof(arr)/sizeof(int));
元素访问
方法 | 示例 | 特点 |
---|---|---|
[] |
vec[2] = 30; |
无边界检查(更快) |
.at() |
vec.at(2) = 30; |
有边界检查(越界抛异常) |
.front() |
int first = vec.front(); |
访问首元素 |
.back() |
int last = vec.back(); |
访问尾元素 |
迭代器 | for(auto it = vec.begin(); it != vec.end(); ++it) |
安全遍历 |
容量管理
vec.size(); // 当前元素数量 → 3
vec.capacity(); // 实际分配的内存容量 → 4(可能大于size)
vec.empty(); // 是否为空 → false
vec.reserve(100); // 预分配100个元素的内存(避免多次扩容)
vec.shrink_to_fit(); // 释放多余内存(capacity减到size大小)
修改操作
添加元素
vec.push_back(6); // 尾部插入 → {1,2,3,4,5,6}
vec.emplace_back(7); // 尾部构造(避免拷贝,C++11)
vec.insert(vec.begin() + 2, 99); // 位置2插入99 → {1,2,99,3,4,5}
删除元素
vec.pop_back(); // 删除尾部 → {1,2,3,4}
vec.erase(vec.begin() + 1); // 删除位置1 → {1,3,4}
vec.erase(vec.begin(), vec.begin() + 2); // 删除范围
vec.clear(); // 清空所有元素
遍历方式
// 1. 下标遍历
for(size_t i=0; i<vec.size(); ++i) {
std::cout << vec[i] << " ";
}
// 2. 范围for循环(C++11)
for(int num : vec) {
std::cout << num << " ";
}
// 3. 迭代器
for(auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
高级用法
自定义类型
struct Person {
std::string name;
int age;
Person(std::string n, int a) : name(n), age(a) {}
};
std::vector<Person> people;
people.emplace_back("Alice", 25); // 直接构造,避免临时对象
二维数组
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 访问元素
int val = matrix[1][2]; // → 6
与算法库结合
#include <algorithm>
std::sort(vec.begin(), vec.end()); // 排序
auto it = std::find(vec.begin(), vec.end(), 3); // 查找元素
性能特点
- 随机访问:O(1) 时间复杂度
- 尾部插入/删除:平均 O(1)
- 中间插入/删除:O(n)(需移动元素)
- 内存增长策略:通常按当前容量的 50%~100% 扩容(实现相关)
最佳实践
- 优先用
emplace_back()
替代push_back()
(避免拷贝) - 循环中插入/删除元素时注意迭代器失效问题
- 预分配内存:
reserve()
减少扩容开销 - 传递大 vector 时使用引用:
void func(const std::vector<int>& vec)
- C++17 支持结构化绑定:
for(const auto& [x,y] : points) { ... }
完整文档参考:cppreference - vector