OVSolitario-io

导航

Set

set.lower/upper_bound(),单次logn
迭代器++/--,最坏logn,均摊(遍历一遍)O(1)

二叉排序树

对于结点u,左儿子 <= u <= 右儿子
对于12345,树为:
截屏2025-08-26 11.33.09
进行中序遍历: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()函数返回的是另一个迭代器,所以修改返回的迭代器不会对其本身做修改

posted on 2025-08-26 11:26  TBeauty  阅读(17)  评论(0)    收藏  举报