KH数据结构入门与stl
unique
- O(N) 去重 (只去相邻重复)
-
- 离散化 (Sort + Unique + Erase) 必须先 Sort! m = unique(a, a+n) - a; 返回去重后末尾指针。
next_permutation O(N)
- 下一个全排列
- 暴力枚举全排列
- 生成字典序
do { ... } while(next_permutation(all(s)));
lower_boundO(logN)
- 找 val 的第一个位置
- LIS (最长上升子序列)
- 查找排名/前驱后继返回迭代器。
idx = lower_bound(all(v), val) - v.begin();
__gcd
- O(logV)
- 最大公约数
- 数论、化简分数
lcm(a,b) = a/gcd(a,b)*b
fill
- O(N)
- 赋值
- 初始化数组/容器
fill(a, a+n, val);比 memset 安全,支持任意值 (memset 只能 0/-1/0x3f)。
vector 我的最爱
- 支持可变大小,不支持开出来的大小清空
- O(1) push_back(),
pop_back() - O(n) insert(),erase()
- 连续空间,可以直接指针++
- resize() 改变大小且填充默认值;reserve() 只预留空间不改大小(优化常数神器)。
- 邻接表存图
vector<int> G[N]
deque 支持双向
- 头尾插入放出O(1)
push_front;push_back;pop_front;pop_back - 适用于滑动窗口
- 0-1 BFS (边权只为0或1的最短路)
string
- 拼接 + 是 O(N)
- 配合 stringstream 做类型转换
- s.find() 找不到返回 string::npos。
- 千万别在循环里 s = s + c,要用 s += c。
priority_queue 优先队列
- push,pop,O(logn) 方便贪心最大最小
- 可以通过重载运算符来达成最大或者这最小
list
- O(1)删除任意节点
erase - 不能随机访问
stack
- 后缀表达式
- DFS
queue
- BFS
- 注意队列不能遍历,没有operator[],如果要遍历却不出队可以使用deque
set 自动去重的有序集合
- O(log n)查找
find();插入于删除 - 支持
lower_bound(x)``upper_bound(x)依旧O(log n) - 场景:动态维护有序序列且快速去重;坐标压缩
- 清空数组set.clear()
- 注意:
bc.push_back({t, (int)cnt.size()})(这里的cnt是set类型的)类似于这一句需要强制类型转换,因为set.size()函数返回的是无符号类型
multiset 和set完全一样但是允许重复元素
- 动态维护中位数 场景:滑动窗口中位数
- 贪心(类似堆,但支持删任意值)实现O(log n)美丽复杂度的查找与删除,利于维护优先队列(包括
lower_bound(x)``upper_bound(x)) - 大坑: erase(val) 会删掉所有等于 val 的元素;erase(iter) 只删一个。 iter是迭代器
map
(例子定义:map<int,int> mp;)
-
增删查均为 O(logN)
-
离散化
-
自动排序的去重统计
-
启发式合并
-
支持 mp[x]快速访问与插入
-
mp.count(key)判断成员是否存在(仅仅判断请用这个,如果用operator会插入对应键值对,,默认数值为0)
-
离散化映射;建图
-
mp的遍历: for (auto it = nums.begin(); it != nums.end(); it++) 提取内容写法: auto hsh=it->second;
-
用map做索引放数组
1 | map<int, vector<pii>> mp; |
std::unordered_set / unordered_map —— 哈希表(平均 O(1))但是好像最坏能到O(n)
我不会,也没做过类似的题,以下内容均由ai生成
- 平均时间复杂度O(1),find,insert,等操作都快
- 无序
- 不支持lower_bound
- 键值唯一
- 哈希冲突严重时退化成链表O(n)
- 字符串/大数 快速映射
- 频率统计
堆 std::priority_queue
- 好东西
- 最短路dijkstra
- 贪心
- 合并果子
- 写法:
- 在 priority_queue 的 cmp 中,return true 的含义是: “左边这个元素(a) 比 右边这个元素(b) 优先级更低。”
- top O(1)
- push/pop O(logN)
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ZuesHans's little bag!









