vector

动态数组:push_back 自动扩容,越界不检查——竞赛最常用容器。

CSP-JCSP-S

◎学完你会

1动一动:push_back 扩容

vector<int> v; // 空 vector,容量从 0 起 v.push_back(3); // 容量不足时自动翻倍扩容 v.push_back(7); cout << v.size(); // 2
v 的内容:[]
看尾部插入、容量变化。

2关键命令

写法含义注意
v.push_back(x)尾部插入自动扩容
v[i]下标取元素越界不检查 ⚠️
v.size()元素个数O(1)
v.pop_back()删尾O(1)
v.clear()清空O(n)
下标 v[i] 越界不检查:访问越界是未定义行为,可能崩溃。v.at(i) 会检查(慢一点,调试用)。竞赛常用 [] 但保证不越界。

⚠易错点

越界访问不检查:v[i] 越界不抛异常、也不提示,直接访问越界内存——未定义行为。访问前确保 i < v.size()。
下标 vs 迭代器:v[i] 依赖下标;迭代器 for(auto it=v.begin();it!=v.end();++it) 更通用(set/map 也能用)。vector<vector<int>> 做二维,注意 >> 写 > > 或 C++11 起可连写。

?跨学科:vector 像“自动加座的餐厅”

来多少客人开多少座,座位不够自动加桌子(扩容),不用你提前数。要新加一位客人就 push_back。

但也有讲究:加座(扩容)要重新安排整片区域,偶尔会慢;频繁扩容有成本。所以能预估大小时可以 v.reserve(n) 提前留座,减少搬家次数。

✎练一练

v 里有 3 个元素,却执行 cout << v[5];,会怎样?
v[i] 下标访问越界不检查,是未定义行为——不抛异常也不自动扩容。要安全用 v.at(i),或保证 i < v.size()。
想拿 vector 里有多少个元素,用哪个?
答案:v.size()。它是 O(1),返回当前元素个数。v.capacity() 是已分配容量(可能 ≥ size),不要弄混。