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]...\)

对顶堆和可删堆(堆的常数小)

重载运算符

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\)

posted @ 2020-10-17 17:13  andysj  阅读(172)  评论(2编辑  收藏  举报