跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入。元素的搜索依旧具有对数级的算法时间复杂度,find和equal_range函数能够搜索出某一键值下的全部元素位置。
创建multiset对象
有下面几种方式。
(1) multiset()
multiset<int> ms;
(2) multiset(constkey_compare&cmp)
//student结构体
structstudent{
int id;
char *name;
};
//比較函数
structstuLess{
bool oprator()(const student &s1,conststudent &s2){
return s1.id<s2.id;
}
};
//创建multiset对象
multiset<student,stuLess> ms(stuLess);
(3) multiset(const multiset&)
//multiset<int> ms1;
multiset<int> ms2(ms1);
(4) miltiset(InputIteratorfirst,InputIterator last)
int array[]={1,2,3,4,5};
multiset<int> ms(array,array+5);
(5) miltiset(InputIteratorfirst,InputIterator last, const key_compare&cmp)
student stuArray[]={{1,”li”},{2,”shi”},{3,”wang”}};
multiset<student,stuLess> ms(stuArray,stuArray+3,stuLess());
插入
multiset的插入函数与set类似。一般用insert,有三种形式。
(1) iterator insert(constvalue_type&v)
(2) iterator insert(iterator pos, constvalue_type&v)
(3) void insert(InputIteratorfirst,InputIterator last)
删除
multiset的元素删除与set容器的删除全然一致,主要是erase和clear函数。
遍历
利用迭代器进行遍历訪问元素。
#include<iostream> #include<set> using namespace std; int main() { multiset<int> ms; //无序输入 ms.insert(1); ms.insert(21); ms.insert(11); ms.insert(10); ms.insert(9); ms.insert(9); multiset<int>::iterator begin,end; end=ms.end(); for(begin=ms.begin();begin!=end;begin++) { cout<<*begin<<" ";//有序输出 } cout<<endl; return 0; }
反向遍历
利用反向迭代器reverse_iterator和const_reverse_iterator进行反向迭代,降序输出。
#include<iostream> #include<set> using namespace std; int main() { multiset<int> ms; ms.insert(1); ms.insert(1); ms.insert(5); ms.insert(4); ms.insert(1); multiset<int>::reverse_iterator rbegin,rend; rend=ms.rend(); for(rbegin=ms.rbegin();rbegin!=rend;rbegin++) { cout<<*rbegin<<" "; } cout<<endl; return 0; }
元素的搜索
find函数返回第一个搜索到的元素的位置。假设元素不存在,则返回end结束元素位置。
equal_range函数则返回一个能够指示相等元素范围区间的pair对象。
原型例如以下:
(1) iterator find(constkey_type&k)
(2) pair<iterator,iterator>equal_range(constkey_type&k)
返回一个pair对象。其first变量值为lower_bound(k),second变量值为upper-bound(k),分别指向大于等于k(x>=k)和大于k(x>k)的第一个元素位置。即给出相等元素的位置范围。
#include<iostream> #include<set> using namespace std; int main() { multiset<int> ms; ms.insert(11); ms.insert(21); ms.insert(10); ms.insert(11); ms.insert(11); ms.insert(11); ms.insert(9); int v=9; multiset<int>::iterator i_v=ms.find(v); cout<<*i_v<<endl; v=11; pair<multiset<int>::iterator,multiset<int>::iterator>p=ms.equal_range(v); cout<<"大于等于"<<v<<"的第一个元素为"<<*p.first<<endl; cout<<"大于"<<v<<"的第一个元素为"<<*p.second<<endl; //打印反复键值元素11 multiset<int>::iterator i; cout<<"键值为"<<v<<"的全部元素为"; for(i=p.first;i!=p.second;i++) { cout<<*i<<" "; } return 0; }
其它函数
其它经常使用的函数有empty、size、count、lower_bound、upper_bound等。