关于set和multiset自带的lower_bound和upper_bound

yuanheci 2023年03月03日 204次浏览

multiset也称为多重集合,可以用于模拟有序数组。

algorithm库中的二分函数
需要传入左右区间。
lower_bound(a.begin(), a.end(), x):查找大于等于x的第一个位置,返回的是迭代器。
upper_bound(a.begin(), a.end(), x):查找大于x的第一个位置,返回的是迭代器。

C++对set容器使用二分查找时,不能用上面的两个属于algorithm库的函数,需要使用set自带的二分函数,否则会超时。
注意: set自带的二分函数包含的容器有两种:setmultiset,而unordered_set没有内置的二分函数(他们的数据结构不同,unordered_sethash)。返回的也是迭代器。
例如:
不能传入区间,只能传入一个比较值x

multiset<int> ms;
auto it1 = ms.lower_bound(x);
auto it2 = ms.upper_bound(x);

printf("%d %d\n", *it1, *it2);

原因:
set<>::iterator不支持随机访问,所以直接当作普通的序列进行二分的时候就不是O(logn)的复杂度了。
所以,一定要使用std::set::lower_bound


set和multiset的迭代器常用操作

属于双向迭代器,只能++, --, prev(it), next(it)

multiset<int> ms;
auto it = ms.insert(a[i]);   //插入,返回迭代器