动态数组:push_back 自动扩容,越界不检查——竞赛最常用容器。
vector 做动态数组,push_back 自动扩容;size() / [] / 遍历;| 写法 | 含义 | 注意 |
|---|---|---|
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()。v[i] 依赖下标;迭代器 for(auto it=v.begin();it!=v.end();++it) 更通用(set/map 也能用)。vector<vector<int>> 做二维,注意 >> 写 > > 或 C++11 起可连写。来多少客人开多少座,座位不够自动加桌子(扩容),不用你提前数。要新加一位客人就 push_back。
但也有讲究:加座(扩容)要重新安排整片区域,偶尔会慢;频繁扩容有成本。所以能预估大小时可以 v.reserve(n) 提前留座,减少搬家次数。
cout << v[5];,会怎样?v[i] 下标访问越界不检查,是未定义行为——不抛异常也不自动扩容。要安全用 v.at(i),或保证 i < v.size()。v.size()。它是 O(1),返回当前元素个数。v.capacity() 是已分配容量(可能 ≥ size),不要弄混。