[STL] multiset
RT,可重集合。
它可以看成一个序列,插入一个数,删除一个数都能够在\(O(logn)\)的时间内完成,并且时刻保证序列中的数是有序的,且序列中可以存在重复的数。
头文件&定义
#include<set>
multiset<int> g;
像其他类型的STL一样,它不仅仅能存\(int\)类型的变量。但是如果要存一个自定义类型的变量进去,需要重载<
运算符。比如:
struct node {
int x,y;
friend bool operator < (const node &a) const {
return x<a.x;
}
};
multiset<node> g;
常用操作
构造函数
操作 | 效果 |
---|---|
multiset < type > name | 产生一个multiset序列 |
multiset < type,cmp > name | 以cmp为排序准则,产生一个multiset序列 |
name.~multiset() | 销毁所有元素,释放内存 |
非变动性函数
操作 | 效果 |
---|---|
name.size() | 返回name中元素个数 |
name.empty() | 返回name中是否存在元素 |
搜寻函数
查找为对数复杂度
操作 | 效果 |
---|---|
name.count(x) | 返回x的个数 |
name.find(x) | 返回multiset中x出现的第一个位置 |
name.lower_bound(x) | 返回第一个\(\geq x\)的元素位置 |
name.upper_bound(x) | 返回最后一个\(<x\)的元素位置 |
name.equal_range(x) | 返回一个pair类型的迭代器,first表示x元素第一次出现的位置,second表示x元素最后一次出现的位置 |
与迭代器相关函数(包括插入删除等)
操作 | 效果 |
---|---|
name.begin() | 返回第一个元素的迭代器 |
name.end() | 返回最后一个元素的下一个元素的迭代器 |
name.insert(x) | 插入x,并返回x所在位置的迭代器 |
name.erase(x) | 删除与x相等的所有元素 |
name.erase(it) | 删除迭代器it所指向的元素 |
name.clear() | 清空 |
迭代器
类似于一种指针(具体是不是指针我想不重要)反正就是一种工具
先来关注它如何调用(以multiset为例)
multiset<int>::iterator iter;
这样是一个multiset的迭代器,它初始是空的。
不同的STL的迭代器不同,比如说set
的迭代器是
set<int>::iterator iter;
它支持一些操作
- iter++ :值+1,其实就是指向了下一个元素
- iter--:值-1,指向前一个元素
- *iter :访问这个元素指向的值
所以我们遍历multiset需要用到迭代器
multiset<int> g;
multiset<int>::iterator iter;
for (iter=g.begin();iter!=g.end();iter++)
....
其他
事实上,建议大量运用迭代器删除元素时最好先用find找到迭代器中的元素返回的迭代器再删除,如果直接删除可能会出现奇怪的错误
g[x].erase(g[x].find(*iter));