这个东西还蛮重要的。。。就是在考场上正解想不出来,打暴力需要用一些工具这时又发现忘了怎么用了,这就很尴尬了。。。
1.set
实用性很高,所以放最前面啦~
set
内部通常采用红黑树实现。平衡二叉树的特性使得 set
非常适合处理需要同时兼顾查找、插入与删除的情况。 ——摘自OI wiki
set
中的元素默认从小到大自动排序,但比起堆来支持的操作更多。 其中 multiset
支持插入重复数字,而 set
不能,除此以外操作基本相同。
指针
定义是这样式儿的:
set<int>::iterator it1;
multiset<int>::iterator it2;
set<pair<int,int> >::iterator it3;
支持 * 解除引用(就是将指针变为指针指向的东西)
it=s.lower_bound(val);
int x=*it;
set
的迭代器为双向访问迭代器 ,指针仅可以左移或右移(也就是 ++ 或 --),会移到从小到大排序该数的上/下一个,时间复杂度 。
it=--s.lower_bound(val);
函数
begin()/end()
begin()
返回首元素的迭代器,也就是指向首元素的指针,s.begin()
就是集合中最小的一个。
但由于 set
是左闭右开的,end()
返回的便是尾元素再向后一位的位置,或者说集合中最大元素的下一个位置的迭代器(引自算阶),也就是说是没有元素的,使用要注意。
rbegin()
与 rend()
是指向逆向数组的迭代器,通俗讲 rbegin()
end()
,rend()
begin()
。然并卵
函数名前加 c 为只读迭代器,通常情况下是