01 — std::vector 基础篇
💻 上手代码
最基本的用法
#include <vector>
#include <iostream>
int main() {
std::vector<int> v; // 空 vector,size=0, capacity=0
v.push_back(10); // 尾部追加 10
v.push_back(20); // 尾部追加 20
v.push_back(30); // 尾部追加 30
std::cout << "size: " << v.size() << '\n'; // 3
std::cout << "capacity: " << v.capacity() << '\n'; // 可能是 4
// 用下标访问(和数组一模一样)
std::cout << v[0] << ' ' << v[1] << ' ' << v[2] << '\n'; // 10 20 30
// 范围 for 遍历
for (int x : v)
std::cout << x << ' ';
std::cout << '\n';
// 修改元素
v[1] = 99;
return 0;
}
几种初始化方式
std::vector<int> a; // 空的
std::vector<int> b(5); // 5 个元素,都是 0
std::vector<int> c(5, 42); // 5 个元素,都是 42
std::vector<int> d = {1, 2, 3, 4}; // 初始化列表
std::vector<int> e(d); // 拷贝构造
增删改查速览
std::vector<int> v = {10, 20, 30};
v.push_back(40); // 尾部追加 [10,20,30,40]
v.pop_back(); // 尾部删除 [10,20,30]
v.front(); // 返回第一个 10
v.back(); // 返回最后一个 30
v.empty(); // 是否为空? false
v.clear(); // 清空所有元素 []
💡 关于下标访问:
v[i]不检查越界——越界是未定义行为;v.at(i)越界时抛出std::out_of_range异常,更安全但略慢一丝。
尾部追加:push_back vs emplace_back
#include <string>
std::vector<std::string> words;
words.push_back("hello"); // 从 const char* 构造临时 string,再移入 vector
words.emplace_back(5, 'A'); // 直接传"5个 A"给 string 构造函数,省一次临时对象
经验法则:往 vector 里放元素时,如果参数能直接匹配元素类型的构造函数,优先用
emplace_back。
✍️ 练手题
题 1:反转打印
从控制台读取 N 个整数,用 vector 存,然后从后往前打印。
💡 提示:
push_back读入;反向遍历注意v.size()返回size_t(无符号),建议用for (size_t i = v.size(); i > 0; --i)配合v[i-1]
题 2:去掉尾部零
给定 vector<int>,把末尾所有的 0 删掉。比如 {1,2,0,3,0,0} → {1,2,0,3}。
💡 提示:用
while (!v.empty() && v.back() == 0) v.pop_back();
题 3:观察 capacity 变化
写一个循环,连续 push_back 100 个整数,每次检查 capacity() 是否变了,打印扩容时刻的 size 和 capacity。
你会发现什么规律?
💡 提示:记录上一次的
capacity(),每次push_back后比较是否变化,扩容时刻打印size()和capacity()
❓ 自测 3 问
Q1:v[3] 和 v.at(3) 的区别是什么?
Q2:std::vector<int> v(5) 之后,v.size() 和 v.capacity() 各是多少?v[0] 的值是什么?
Q3:为什么 v.front() 和 v[0] 能用 O(1) 拿到第一个元素?
📋 速查卡
| 项目 | 内容 |
|---|---|
| 本质 | 连续内存的动态数组 |
| 强项 | 尾部增删 O(1),随机访问 O(1),CPU 缓存友好 |
| 弱项 | 中间插入/删除 O(n),扩容时有拷贝开销 |
| 头文件 | #include <vector> |
| 关键 API | push_back / emplace_back / pop_back / front / back / size / capacity / clear / empty / operator[] |
| 常见坑 | 不要在有扩容风险的循环里持有元素的指针或引用 |
| 下一课 | 迭代器基础 |

浙公网安备 33010602011771号