std::vector 动态数组
push_back/emplace_back、reserve/size、遍历删除、性能陷阱
std::vector 动态数组
std::vector<T> 是 C++ 最常用的容器——自动扩容、连续存储、元素访问 O(1)。
学完本章你将: 掌握 push_back/emplace_back、size/capacity、遍历与删除。
基本操作
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
// 添加元素
v.push_back(4); // 拷贝或移动
v.emplace_back(5); // 原地构造(更高效)
// 访问
std::cout << v[0] << "\n"; // 不检查边界
std::cout << v.at(0) << "\n"; // 检查边界(抛异常)
std::cout << v.front() << "\n"; // 第一个
std::cout << v.back() << "\n"; // 最后一个
// 大小
std::cout << "size: " << v.size() << "\n"; // 5
std::cout << "capacity: " << v.capacity() << "\n"; // 分配的内存
return 0;
}
预分配与收缩
cpp
std::vector<int> v;
v.reserve(1000); // 预分配空间,避免反复扩容
for (int i = 0; i < 1000; i++) {
v.push_back(i); // 不会触发重新分配
}
v.shrink_to_fit(); // 释放多余空间(capacity → size)
遍历
cpp
std::vector<int> v = {1, 2, 3, 4, 5};
// 范围 for(推荐)
for (int x : v) std::cout << x << " ";
// 带索引遍历
for (size_t i = 0; i < v.size(); i++) {
std::cout << v[i] << " ";
}
// 迭代器
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
删除的陷阱
cpp
// ❌ 边遍历边删除——迭代器失效
for (auto it = v.begin(); it != v.end(); ++it) {
if (*it % 2 == 0) v.erase(it); // it 失效!
}
// ✅ 正确方式:erase 返回下一个有效迭代器
for (auto it = v.begin(); it != v.end(); ) {
if (*it % 2 == 0) it = v.erase(it);
else ++it;
}
// ✅ C++20: std::erase_if
std::erase_if(v, [](int x) { return x % 2 == 0; });