multiset
也称为多重集合,可以用于模拟有序数组。
algorithm库中的二分函数
需要传入左右区间。
lower_bound(a.begin(), a.end(), x)
:查找大于等于x
的第一个位置,返回的是迭代器。
upper_bound(a.begin(), a.end(), x)
:查找大于x
的第一个位置,返回的是迭代器。
C++对set
容器使用二分查找时,不能用上面的两个属于algorithm
库的函数,需要使用set
自带的二分函数,否则会超时。
注意: set
自带的二分函数包含的容器有两种:set
,multiset
,而unordered_set
没有内置的二分函数(他们的数据结构不同,unordered_set
是hash
)。返回的也是迭代器。
例如:
不能传入区间,只能传入一个比较值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]); //插入,返回迭代器