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能夠在插入元素的時候自動去比較已有的元素(重載運算符)。