Set
set.lower/upper_bound(),单次logn
迭代器++/--,最坏logn,均摊(遍历一遍)O(1)
二叉排序树
对于结点u,左儿子 <= u <= 右儿子
对于12345,树为:

进行中序遍历:12345,即为set用处
Set:维护元素是否存在,查询大于等于/大于它的最小数字,以及维护本质不同元素个数(如1234本质为4个数)
bool operator<(const Node &o) const {
//return x + y < o.x + o.y;
if(!x = o.x) return x < o.x;
return y < o.y;
}
for(auto x : s)//遍历set按照从小到大输出,因此要重载小于号
set自带的lower/upper_bound():
*s.lower_bound(x);//因为set自身保留begin()end()所以使用第三个参数即可(返回迭代器)
对于不存在元素依然要判断-1
set查找小于x的最大的数:
即然lower_bound()有查询第一个大于等于,那么其前面的一个一定是严格小于它的数,即找到
*(s.lower_bound(x) - 1);//❌输出不了
*(-- s.lower_bound(x));//✅仅支持++和--
且++和--必须是前置
algorithm中是随机访问迭代器可以任意取加几减几,而set这里是双向访问迭代器仅支持++和--操作
当x = 1,*(-- s.lower_bound(x));也会溢出内存
set查找最后一个数:*(-- s.end());
对于--,不是会让迭代器前移?
因为end()函数返回的是另一个迭代器,所以修改返回的迭代器不会对其本身做修改
浙公网安备 33010602011771号