[STL基础]multiset多重集合
网上实例[cpp]#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中可以出现副本键,同一值可以出现多次。*///定义及初始化;没有返回值,或voidvoid 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 15for (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 Tvoid 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_iteratorvoid 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);补充:软件开发 , C++ ,
上一个:菜鸟都能理解的0-1背包问题的空间优化
下一个:hdu2199 二分枚举
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊