C++中multiset容器是STL模板<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数(而set容器要求两两不同,且不保证有序)。
常用成员函数
insert(elem):添加一个elem副本,返回新元素位置,无论插入成功与否。
insert(pos, elem):添加一个elem元素副本,返回新元素位置,pos为收索起点,提升插入速度。
insert(beg,end):将区间[beg,end)所有的元素安插到my_multiset,无返回值。
erase(elem):删除与elem相等的所有元素,返回被移除的元素个数。
erase(pos):移除迭代器pos所指位置元素,无返回值。
erase(beg,end):移除区间[beg,end)所有元素,无返回值。
clear():移除所有元素,将容器清空。
begin():返回一个随机存取迭代器,指向第一个元素。
end():返回一个随机存取迭代器,指向最后一个元素的下一个位置。
rbegin():返回一个逆向迭代器,指向逆向迭代的第一个元素。
rend():返回一个逆向迭代器,指向逆向迭代的最后一个元素的下一个位置。
查找函数
count (elem):返回元素值为elem的个数。
find(elem):返回元素值为elem的第一个元素,如果没有返回end()。
lower _bound(elem):返回元素值为elem的第一个可插入位置,也就是元素值 >= elem的第一个元素位置。
upper _bound (elem):返回元素值为elem的最后一个可插入位置,也就是元素值 > elem 的第一个元素位置。
equal_range (elem):返回elem可插入的第一个位置和最后一个位置,也就是元素值==elem的区间。
自定义multiset比较器
不只是int类型,multiset还可以存储其他的类型诸如 string类型,结构体(struct)或类(class)类型。而我们一般在编程当中遇到的问题经常用到自定义的类型,即struct或class。例如下面的例子:
struct student{
int h,w; }; multiset<student>s;
由于multiset并不知道如何去比较一个自定义的类型。可以定义multiset里面student类型变量之间的小于关系的含义(这里以h为第一关键字为例),具体过程如下:
定义一个比较类cmp,cmp内部的operator函数的作用是比较student类型h和w的大小(以h为第一关键字,w为第二关键字):
struct cmp{ bool operator()(const student&s1,const student&s2){ return s1.h<s2.h||s1.h==s2.h&&s1.w<s2.w; } };
然后将语句"multiset<student>s"改成"multiset<student,cmp>s"这样以后,就使序列s能够在插入元素的时候自动去比较已有的元素(重载运算符)。