[STL基础]multiset多重集合

网上实例 

#include <string>
#include <set> 
#include <conio.h>
#include<iostream>
using namespace std;   
//multiset多重集合与set集合的区别:multiset可以拥有多个相同的元素,而set中的元素是唯一的。由此,其函数的不同:erase()参数是元素时,会删除其全部相同的数据。其他的函数与用法与set完全一致。
/*
set和multiset的内部结构通常是由平衡二叉树来实现的。当元素放入容器中时,会按照一定的排序法则自动排序,默认是按照less<>排序规则来排序。这种自动排序的特性加速了元素查找的过程,但是也带来了一个问题,不可以直接修改set或multiset容器中的元素值,因为这样就可能违反了元素自动排序的规则。如果你希望修改一个元素的值,必须先删除原有的元素,再插入新的元素。
一个集合(set)是一个容器,它其中的所包含的元素的值是唯一的。集合多集的区别是:set支持唯一的键值,set中的值都是特定的,而且只出现一次;而multiset中可以出现副本键,同一值可以出现多次。
*/
//定义及初始化;没有返回值,或void
void test0()
{  
	multiset<int> f; 
	int myint[]={23,3,6,6,0};
	multiset<int>se(myint,myint+5);//初始化[beg,end)
	multiset<int>th(se.begin(),se.end());//初始化[beg,end),与上面雷同
	multiset<int>fo(se);//拷贝构造函数 
}
//增加删除元素;返回值是void,除erase()的返回值是iterator外
void test1()
{ 	//insert:1.直接插入一个数据 2.在iterator位置上插入一个数据 3.插入[beg,end)一段数据  
	multiset<int> myset;
	multiset<int>::iterator it=myset.begin();
	myset.insert(20);
	for (int i=0;i<5;i++)
	{
		myset.insert(i*10);//0 10 20 20 30 40
	} 
	myset.insert(it,24);
	int myint[]={5,10,15};
	myset.insert(myint,myint+3);//插入的是[beg,end);
	for (it=myset.begin();it!=myset.end();it++)
	{
		cout<<*it<<" ";//0 5 10 10 15 20 20 24 30 40
	}
	cout<<endl;
	//erase:1.删除一个数据 2.删除在iterator位置上的数据 3.删除在[beg,end)区间的数据
	myset.erase(20);//0 5 10 10 15 24 30 40//删除所有值是20的元素
	it=myset.find(10);
	myset.erase(it);//0 5 10 15 24 30 40//只删除一个元素
	it=myset.find(24);
	myset.erase(it,myset.end());//0 5 10 15 
	for (it=myset.begin();it!=myset.end();it++)
	{
		cout<<*it<<" ";//0 5 10 15
	}
	myset.clear();//删除所有元素
	//set 的属性(通常是那些没有参数的函数):empty(),size()
	if (myset.empty())//判断集合是否为空
	{
		cout<<"\nmyset is empty"<<endl;
	}
	if (myset.size()==0)//判断集合是否为空
	{
		cout<<"myset size is 0"<<endl;
	}
	int myints[]={24,12,12,18,9};
	multiset<int>first(myints,myints+2),second(myints+1,myints+5);//初始化是:[beg,end)
	first.swap(second); 
	for (it=first.begin();it!=first.end();it++)
	{
		cout<<*it<<" ";//9 12 12 18
	}
 	cout<<endl;
	for (it=second.begin();it!=second.end();it++)
	{
		cout<<*it<<" ";//12 24
	}
	cout<<endl;    
}
//访问获取元素;返回值是Type T
void test2()
{   
	int myint[]={75,23,65,65,42,13};
	multiset<int> myset(myint,myint+5);
	cout<<*myset.find(65)<<endl;//65 //查找元素的位置iterator,若没有此元素,则返回myset.end()(最后一个元素的下一个位置)
	cout<<myset.count(65)<<endl;//2 查询元素的个数
}
//返回迭代器;返回值是iterator,或reverse_iterator
void test3()
{ 
	int myint[]={75,23,65,65,42,13};
	multiset<int> myset(myint,myint+5);//初始化:[beg,end)
	for (multiset<int>::iterator it=myset.begin();it!=myset.end();it++)
	{
		cout<<*it<<" ";//13 23 42 65 65 75
	}
	cout<<"\nreverse myset:"<<endl;
	for (multiset<int>::reverse_iterator it=myset.rbegin();it!=myset.rend();it++)
	{
		cout<<*it<<" ";//75 65 65 42 23 13
	}
	cout<<endl;     
} 
//其他
void test4()
{  
	int myint[]={75,23,65,65,42,13};
	multiset<int> myset(myint,myint+6);//初始化:[beg,end)
	multiset<int>::key_compare com=myset.key_comp();
	multiset<int>::iterator it=myset.begin();
	int keyHighest=*myset.rbegin();//不能使用*myset.end()
	do 
	{
		cout<<" "<<*it;//13 23 42 65 65 75
	} while (com(*(it++),keyHighest));
	cout<<endl;

	multiset<int>::value_compare val=myset.value_comp();
	int valHighest=*myset.rbegin();
	it=myset.begin();
	do 
	{
		cout<<" "<<*it;//13 23 42 65 65 75
	} while (val(*(it++),valHighest));
	cout<<endl;

	multiset<int>::iterator itlows,itups;
	itlows=myset.lower_bound(65);
	itups=myset.upper_bound(65);
	cout<<*itlows<<" "<<*itups<<endl;//65 75
	std::pair<multiset<int>::iterator,multiset<int>::iterator> pa=myset.equal_range(42);
	cout<<"the lower bound point to:"<<*pa.first<<endl;//42
	cout<<"the upper bound point to:"<<*pa.second<<endl;//65
	//equal_range():返回pair(iterator,iterator),pair中的第一个迭代器是lower_bound()返回的迭代器,pair中的第二个迭代器是upper_bound()返回的迭代器,如果两个迭代器相等,则说明map中不存在这个关键字;就是在一个有序的数组中,取某个值Q[k]的前一个值Q[k-1]或是他本是Q[k]和后一个值Q[k+1]
	//lower_bound():返回是iterator,返回要查找关键字的下界(是一个迭代器),指向键值<=key的第一个元素
	//upper_bound():返回是iterator,返回要查找关键字的上界(是一个迭代器),指向键值>key的第一个元素
} 
//遍历map中的数据
void test5()
{  
	//1.使用前向迭代器
	//2.使用相反迭代器 
	int myint[]={75,23,65,65,42,13};
	multiset<int> myset(myint,myint+6);//初始化:[beg,end)
	for (multiset<int>::iterator it=myset.begin();it!=myset.end();it++)
	{
		cout<<*it<<" ";//13 23 42 65  65 75
	}
	cout<<"\nreverse myset:"<<endl;
	for (multiset<int>::reverse_iterator it=myset.rbegin();it!=myset.rend();it++)
	{
		cout<<*it<<" ";//75 65 65 42 23 13
	}
	cout<<endl;     
} 
void Test(char h)
{
	cout<<"press key===="<<h<<endl;
	switch(h)
	{ 
	case '0':  test0();break;
	case '1':  test1();break;
	case '2':  test2();break;
	case '3':  test3();break;
	case '4':  test4();break;
	case '5':  test5();break; 
	case 27:
	case 'q':exit(0);break; 
	default:cout<<"default "<<h<<endl;break;
	}
}
void main()
{
	while(1)
	{
		Test(getch());
	} 
}

 

你可能感兴趣的:([STL基础]multiset多重集合)