C++ STL容器(四)之multiset

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;
}

测试结果:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值