C++ multiset容器用法归纳

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能够在插入元素的时候自动去比较已有的元素(重载运算符)。

上一篇:CF706D Vasiliy's Multiset(字典树的删除)


下一篇:ECS使用体验