C++ stl等常用技巧
set和multiset(常数大,慎用)
\(set\)是不可重集,\(multiset\)是可重集。插入、查看、查询的复杂度都是\(O(log(n))\)的。会自动从小到大排序。
迭代器:\(set < int >:: iterator\ \ it = ...\),对应的数值为\(*it\)
\(s.erase(it)\)(删掉迭代器)后,\(it\)就没了!!
几种常见的操作:
\(s.size()\):返回当前的元素数量
\(s.empty()\):判断大小是否为零,等同于\(size()==0\),效率更高
\(s.begin()/s.end()\):返回一个迭代器,指向第一个/最后一个元素
\(s.find(val)\):返回一个迭代器,指向元素值为\(val\)的第一个元素,如果没有返回\(end()\)
\(s.count(val)\):返回元素值为\(val\)的个数
\(s.lower\underline{}bound(val)/s.upper\underline{}bound(val)\):返回一个迭代器,指向元素值 \(\ge{val}/>val\)的第一个元素
\(s.erase(val)\):删除与\(val\)相等的所有元素,返回被移除的元素个数
\(s.erase(pos)\):移除迭代器\(pos\)所指位置元素,无返回值
\(s.insert(val)\):插入值\(val\),返回一个迭代器指向\(val\)
\(s.insert(pos, val)\):插入值\(val\),返回一个迭代器指向\(val\),\(pos\)为搜索起点,提升插入速度
\(s.clear()\):移除所有元素,将容器清空
vector
\(vector\)可以理解为一个动态数组。
注意\(push\_back(x)\)是插入的\(x\)这个数。
遍历\(vector\)可以用迭代器,也可以直接\(for\ (int\ i = 0;\ i <a.size();\ i ++ )\ a[i]...\)
对顶堆和可删堆(堆的常数小)
- 对顶堆:动态维护前\(i\)个元素的第\(k\)大(例:https://www.luogu.com.cn/problem/P1168)
- 可删堆:字面意思(应用:https://www.luogu.com.cn/problem/P3250)
重载运算符
bool operator < (const node &a, const node &b)
{
return a.x < b.x && a.y < b.y;
}//重载运算符“<”
lower_bound() & upper_bound()
\(lower\_bound(a + 1, a + n + 1, x) - a\)是用来找到一个递增数列中,第一个\(\ge{x}\)的数的位置。\(upper\_bound()\)则是\(>x\)。
注意:\(lower\_bound()\)很容易出错,因为可能会有多个相等的数,而它只会找到第一个位置,可能会漏掉数
找不到时都会返回\(0\)