STL 竞赛速查表

算法竞赛中最常用的 C++ STL 组件。持续更新。
完整文档见 cppreference.com。

容器

vector — 动态数组

操作说明复杂度
vector<int> v空 vectorO(1)
vector<int> v(n)n 个 0O(n)
vector<int> v(n, x)n 个 xO(n)
v.push_back(x)末尾插入 x均摊 O(1)
v.pop_back()删除末尾元素O(1)
v.size()元素个数O(1)
v[i]下标访问(不检查)O(1)
v.clear()清空O(n)
v.back()最后一个元素O(1)

string — 字符串

string s空字符串O(1)
s += "abc"追加(比 + 快)O(m)
s.substr(i, len)子串O(len)
s.find("abc")返回下标,未找到返回 nposO(n)
s == t判等O(n)
s[i]字符访问O(1)

stack — 栈

stack<int> s空栈O(1)
s.push(x)入栈O(1)
s.pop()出栈(不返回值)O(1)
s.top()栈顶O(1)
s.empty()是否空O(1)

queue — 队列

queue<int> q空队列O(1)
q.push(x)入队O(1)
q.pop()出队(不返回值)O(1)
q.front()队首O(1)
q.back()队尾O(1)

set / map — 有序容器(红黑树)

操作说明复杂度
set<int> s有序集合,无重复—
map<int,int> m有序键值对—
s.insert(x)插入O(log n)
s.erase(x)删除O(log n)
s.count(x)是否存在(返回 0 或 1)O(log n)
m[key] = val赋值/插入O(log n)
s.begin() / s.end()迭代器首/尾后O(1)

unordered_set / unordered_map — 哈希容器

unordered_set<int> us无序集合—
us.insert(x)插入平均 O(1)
us.count(x)是否存在平均 O(1)
us.erase(x)删除平均 O(1)
⚠️ 能用 unordered_ 就别用 set/map——哈希容器平均更快。但当需要「按大小顺序遍历」时,必须用有序的 set/map。

算法

排序与查找

sort(v.begin(), v.end())升序排序O(n log n)
sort(v.rbegin(), v.rend())降序排序O(n log n)
binary_search(v.begin(), v.end(), x)是否存在 x(需有序)O(log n)
lower_bound(v.begin(), v.end(), x)第一个 ≥ x 的位置O(log n)
upper_bound(v.begin(), v.end(), x)第一个 > x 的位置O(log n)
reverse(v.begin(), v.end())反转O(n)

最值

min(a, b) / max(a, b)两个值的最值O(1)
min_element(v.begin(), v.end())返回最小值的迭代器O(n)
max_element(v.begin(), v.end())返回最大值的迭代器O(n)
🧠 记法:*min_element(v.begin(), v.end()) 加 * 取到值本身。

求和

accumulate(v.begin(), v.end(), 0)求和,0 是初始值O(n)
accumulate(v.begin(), v.end(), 0LL)用 long long 防溢出O(n)

速查表持续更新中 · 最后更新 2024 夏