multiset是一个可容纳重复元素键值的有序多重集合容器,与set组织数据元素的方式类似,都是采用红黑树,它们的区别主要在于set不允许重复元素键值,而multiset允许重复的元素键值。
使用时需使用宏语句(其标准头文件也是set)
#include<set>
一.几种创建multiset的方式:
1.按默认比较函数创建空的multiset;
multiset<int>s1;
2.用自定义比较函数创建空的multiset;
struct comp{
bool operator()(const int a,const int b)
{
return a>b;
}
};//这部分要放在主函数之外独立存在;
multiset<int,comp>s2;
3.拷贝另一个multiset生成新的multiset;
multiset<int>s3(s1);
//若拷贝的那个multiset有自定义比较函数,此multiset也要有相同比较函数;
4.用迭代器区间复制创建multiset;
int a[]={1,2,3,3,4,5};
multiset<int>s4(a,a+6);
5.迭代器区间复制+自定义比较函数;
int b[]={1,2,3,3,4,5};
multiset<int,comp>s5(b,b+6);
二.插入/删除/检索元素:
multiset<int>ms;
1.插入元素value(可重复);
ms.insert(1);
2.删除所有键值为value的元素;
ms.erase(3);
3.搜索键值为value的元素(若不存在返回迭代器end)
if(ms.find(3)!=ms.end()) cout<<"multiset中存在键值为3的元素"<<endl;
else cout<<"multiset中不存在键值为3的元素"<<endl;
三.迭代遍历(正向/反向):
1.正向迭代遍历;
multiset<int>::iterator i;
cout<<"正向迭代遍历:";
for(i=ms.begin();i!=ms.end();i++)
{
cout<<*i<<" ";
}
cout<<endl;
2.反向迭代遍历;
multiset<int>::reverse_iterator ri;
cout<<"反向迭代遍历:";
for(ri=ms.rbegin();ri!=ms.rend();ri++)
{
cout<<*ri<<" ";
}
cout<<endl;
四.其他常用操作:
1.返回键值等于value的元素个数;
cout<<"键值等于3的元素个数为:"<<ms.count(3)<<endl;
2.返回multiset中的元素个数;
cout<<"multiset中的元素数为:"<<ms.size()<<endl;
3.equal_range(value)函数:返回键值等于value的元素的迭代器区间范围(返回值为pair);
//实际上是调用lower_bound返回大于等于value的第一个元素的位置l1,用upper_bound返回大于value的第一个元素的位置l2;
//这样[l1,l2)就是值为value的范围;
pair<multiset<int>::iterator,multiset<int>::iterator> p=ms.equal_range(3);
cout<<"大于等于3的第一个元素为:"<<*p.first<<endl;//也可以用lower_bound;
cout<<"大于3的第一个元素为:"<<*p.second<<endl;//也可以用upper_bound;
4.清空multiset;
ms.clear();
5.判断multiset是否为空;
if(ms.empty()) cout<<"multiset为空"<<endl;
五.测试函数:
#include<cstdio>
#include<set>
#include<iostream>
using namespace std;
struct comp{
bool operator()(const int a,const int b)
{
return a>b;
}
};
int main()
{
/*
1.按默认比较函数创建空的multiset;
multiset<int>s1;
2.用自定义比较函数创建空的multiset;
multiset<int,comp>s2;
3.拷贝另一个multiset生成新的multiset;
multiset<int>s3(s1);
//若拷贝的那个multiset有自定义比较函数,此multiset也要有相同比较函数;
4.用迭代器区间复制创建multiset;
int a[]={1,2,3,3,4,5};
multiset<int>s4(a,a+6);
5.迭代器区间复制+自定义比较函数;
int b[]={1,2,3,3,4,5};
multiset<int,comp>s5(b,b+6);
*/
multiset<int>ms;
//插入元素value(可重复);
ms.insert(1);
ms.insert(2);
ms.insert(3);
ms.insert(3);
ms.insert(4);
ms.insert(5);
//1,2,3,3,4,5;
multiset<int>::iterator i;
cout<<"正向迭代遍历:";
for(i=ms.begin();i!=ms.end();i++)
{
cout<<*i<<" ";
}
cout<<endl;
multiset<int>::reverse_iterator ri;
cout<<"反向迭代遍历:";
for(ri=ms.rbegin();ri!=ms.rend();ri++)
{
cout<<*ri<<" ";
}
cout<<endl;
//equal_range(value)函数:返回键值等于value的元素的迭代器区间范围(返回值为pair);
//实际上是调用lower_bound返回大于等于value的第一个元素的位置l1,用upper_bound返回大于value的第一个元素的位置l2;
//这样[l1,l2)就是值为value的范围;
pair<multiset<int>::iterator,multiset<int>::iterator> p=ms.equal_range(3);
cout<<"大于等于3的第一个元素为:"<<*p.first<<endl;//也可以用lower_bound;
cout<<"大于3的第一个元素为:"<<*p.second<<endl;//也可以用upper_bound;
//返回键值等于value的元素个数;
cout<<"键值等于3的元素个数为:"<<ms.count(3)<<endl;
//删除所有键值为value的元素;
ms.erase(3);
cout<<"删除所有键值为3的元素后:";
for(i=ms.begin();i!=ms.end();i++)
{
cout<<*i<<" ";
}
cout<<endl;
//搜索键值为value的元素(若不存在返回迭代器end)
if(ms.find(3)!=ms.end()) cout<<"multiset中存在键值为3的元素"<<endl;
else cout<<"multiset中不存在键值为3的元素"<<endl;
if(ms.find(1)!=ms.end()) cout<<"multiset中存在键值为1的元素"<<endl;
else cout<<"multiset中不存在键值为1的元素"<<endl;
//返回multiset中的元素个数;
cout<<"multiset中的元素数为:"<<ms.size()<<endl;
//清空multiset;
ms.clear();
//判断multiset是否为空;
cout<<"清空multiset后:";
if(ms.empty()) cout<<"multiset为空"<<endl;
return 0;
}
测试结果: