[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));

参考资料

二喵君

gyro永不抽风

posted @ 2020-11-13 14:22  蒟蒻zyx_qwq  阅读(91)  评论(0编辑  收藏  举报