set,map相关操作
1、set的基本操作
(1)、set的删除、插入操作
代码如下:
#include<iostream>#include<set>usingnamespacestd;//set底层是红黑树,其所包含的元素是唯一的,集合中的元素按一定的顺序排列,元素插入过程是按排序规则插入,所>以不能指定插入位置;intmain(void){//set集合元素唯一自动排序(默认情况下是从小到大)不能按照[]方式插入元素底层红黑树set<int>set1;for(inti=0;i<5;i++){set1.insert(34);set1.insert(24);set1.insert(14);set1.insert(84);set1.insert(-4);}//插入重复的元素set1.insert(100);set1.insert(100);set1.insert(100);set1.insert(100);set<int>::iteratorit;for(it=set1.begin();it!=set1.end();it++){cout<<*it<<"";}cout<<endl;//删除集合中的元素while(!set1.empty()){set<int>::iteratorit=set1.begin();cout<<*it<<"";set1.erase(set1.begin());}cout<<endl;return0;}
(2)、set的排序
代码如下:
#include<iostream>#include<set>usingnamespacestd;//对于基础数据可以进行排序,复杂数据类型的排序是怎么回事?------>仿函数解决intmain(void){set<int>set1;//默认排序从小到大set<int,less<int>>set2;//集合是从小到大set<int,greater<int>>set3;//集合从大到小的输出;for(inti=0;i<5;i++){set3.insert(11);set3.insert(45);set3.insert(99);set3.insert(77);set3.insert(66);}//从大到小的排序set<int,greater<int>>::iteratorit;for(it=set3.begin();it!=set3.end();it++){cout<<*it<<"";}cout<<endl;return0;}
(3)、set中为复杂数据类型时的排序
代码如下:
#include<iostream>#include<string.h>#include<set>usingnamespacestd;classStudent{public:Student(constchar*name,intage){strcpy(this->name,name);this->age=age;}public:charname[32];intage;};//仿函数:重载了(),structFunStudent{booloperator()(constStudent&left,constStudent&right){if(left.age<right.age){//左边的小,就返回为真!!从小到大进行排序returntrue;}else{returnfalse;}}};intmain(void){/*Students1("s1",31);Students2("s2",22);Students3("s3",55);Students4("s4",11);Students5("s5",31);//如果2个31岁,能插入成功吗?//如何知道插入的结果,看函数的返回值set<Student,FunStudent>set1;//集合中插入的是学生类型(复杂数据类型),会调用这个仿函数set1.insert(s1);set1.insert(s2);set1.insert(s3);set1.insert(s4);set1.insert(s5);set<Student,FunStudent>::iteratorit;for(it=set1.begin();it!=set1.end();it++){cout<<it->age<<""<<it->name<<endl;}*///如何判断set1.insert()函数的返回值Students1("s1",31);Students2("s2",22);Students3("s3",55);Students4("s4",11);Students5("s5",31);//此时,由于比较的是age,所以将会插入失败,因为仿函数中用的是age做的键值;set<Student,FunStudent>set1;//集合中插入的是学生类型(复杂数据类型),会调用这个仿函数pair<set<Student,FunStudent>::iterator,bool>pair1=set1.insert(s1);if(pair1.second==true){//insert()的返回值是pair(对组)类型;cout<<"插入s1成功"<<endl;}else{cout<<"插入s1失败"<<endl;}set1.insert(s2);set1.insert(s3);set1.insert(s4);pair<set<Student,FunStudent>::iterator,bool>pair5=set1.insert(s5);if(pair5.second==true){cout<<"插入s1成功"<<endl;}else{cout<<"插入s1失败"<<endl;}set<Student,FunStudent>::iteratorit;for(it=set1.begin();it!=set1.end();it++){cout<<it->age<<""<<it->name<<endl;}return0;}
(4)、set中迭代器的使用
代码如下:
#include<iostream>#include<algorithm>#include<set>usingnamespacestd;//返回值为pair的类型要学会使用;intmain(void){set<int>set1;for(inti=0;i<10;i++){set1.insert(i+1);}set<int>::iteratorit;for(it=set1.begin();it!=set1.end();it++){cout<<*it<<"";}cout<<endl;set<int>::iteratorit0=set1.find(5);cout<<"it0:"<<*it0<<endl;intnum1=set1.count(5);cout<<"num1:"<<num1<<endl;set<int>::iteratorit1=set1.lower_bound(5);//大于等于5的元素的迭代器的位置cout<<"it1:"<<*it1<<endl;set1.erase(5);//删除容器中值为5的所有元素pair<set<int>::iterator,set<int>::iterator>mypair=set1.equal_range(5);//函数的返回值为对组cout<<*mypair.first<<endl;//迭代器中第一个找的是大于等于5的cout<<*mypair.second<<endl;//代器中的第二个找的是大于5的return0;}
2、multiset的基本操作
代码如下:
#include<iostream>#include<set>usingnamespacestd;intmain(void){multiset<int>set1;inttmp=0;cout<<"请输入multiset集合中的值:";cin>>tmp;while(tmp!=0){set1.insert(tmp);cout<<"请输入multiset集合中的值:";cin>>tmp;}multiset<int>::iteratorit;for(it=set1.begin();it!=set1.end();it++){cout<<*it<<"";}cout<<endl;while(!set1.empty()){multiset<int>::iteratorit=set1.begin();cout<<*it<<"";set1.erase(it);}cout<<endl;return0;}
3、map的基本操作
(1)、map元素的添加、遍历、删除
代码如下:
#include<iostream>#include<string>#include<map>usingnamespacestd;//map元素的添加、遍历、删除intmain(void){map<int,string>map1;//因为map是key-value结构,所以可以做成pair(对组)//初始化map://方法1、map1.insert(pair<int,string>(1,"teacher01"));map1.insert(pair<int,string>(2,"teacher02"));//方法2、map1.insert(make_pair(3,"teacher03"));map1.insert(make_pair(4,"teacher04"));//方法3、map1.insert(map<int,string>::value_type(5,"teacher05"));map1.insert(map<int,string>::value_type(6,"teacher06"));//方法4、map1[7]="teacher07";map1[8]="teacher08";//容器的遍历map<int,string>::iteratorit;for(it=map1.begin();it!=map1.end();it++){cout<<it->first<<""<<it->second<<endl;//map的遍历,跟pair(对组)一样,first表示第一个(键key),second表示第二个(值value);}cout<<"遍历结束"<<endl;//容器的删除while(!map1.empty()){map<int,string>::iteratorit=map1.begin();cout<<it->first<<""<<it->second<<endl;map1.erase(it);}return0;}
(2)、map中4种初始化的分析
代码如下:
#include<iostream>#include<map>usingnamespacestd;//前三种初始化方法的返回值都为:pair(iterator,bool)//插入四中方法的异同//结论:前三种方法,若key已经存在,此时在进行插入,将会报错;//方法4、若key已经存在,则修改;intmain(void){map<int,string>map1;//方法1、pair<map<int,string>::iterator,bool>mypair1=map1.insert(pair<int,string>(1,"teacher01"));map1.insert(pair<int,string>(2,"teacher02"));//方法2、pair<map<int,string>::iterator,bool>mypair3=map1.insert(make_pair(3,"teacher03"));map1.insert(make_pair(4,"teacher04"));//方法3、pair<map<int,string>::iterator,bool>mypair5=map1.insert(map<int,string>::value_type(5,"teacher05"));if(mypair5.second!=true){cout<<"key5插入失败"<<endl;}else{cout<<mypair5.first->first<<""<<mypair5.first->second<<endl;}pair<map<int,string>::iterator,bool>mypair6=map1.insert(map<int,string>::value_type(5,"teacher06"));if(mypair6.second!=true){cout<<"key5插入失败"<<endl;//因为键值相同,所以插入会失败;}else{cout<<mypair6.first->first<<""<<mypair6.first->second<<endl;}//前三种初始化方法的返回值都为:pair(iterator,bool)//方法4、map1[7]="teacher07";map1[7]="teacher08";map<int,string>::iteratorit;for(it=map1.begin();it!=map1.end();it++){cout<<it->first<<"\t"<<it->second<<endl;}cout<<"遍历结束"<<endl;return0;}
(3)、map查找
代码如下:
#include<iostream>#include<map>usingnamespacestd;intmain(void){map<int,string>map1;//因为map是key-value结构,所以可以做成pair(对组)//初始化map://方法1、map1.insert(pair<int,string>(1,"teacher01"));map1.insert(pair<int,string>(2,"teacher02"));//方法2、map1.insert(make_pair(3,"teacher03"));map1.insert(make_pair(4,"teacher04"));//方法3、map1.insert(map<int,string>::value_type(5,"teacher05"));map1.insert(map<int,string>::value_type(6,"teacher06"));//方法4、map1[7]="teacher07";map1[8]="teacher08";//容器的遍历map<int,string>::iteratorit;for(it=map1.begin();it!=map1.end();it++){cout<<it->first<<""<<it->second<<endl;//map的遍历,跟pair(对组)一样,first表示第一个(键key),second表示第二个(值value);}cout<<"遍历结束"<<endl;//map的查找,返回值都是迭代器map<int,string>::iteratorit2=map1.find(2);if(it2==map1.end()){cout<<"key100的值不存在"<<endl;}else{cout<<it2->first<<"\t"<<it2->second<<endl;}//equal_range,异常处理pair<map<int,string>::iterator,map<int,string>::iterator>mypair=map1.equal_range(5);//此时返回2个迭代器,形成一个pair(对组)//第一个迭代器,是>=5的位置//第二个迭代器是>5的位置//使用第一个迭代器if(mypair.first==map1.end()){cout<<"第一个迭代器,是>=5的位置不存在"<<endl;}else{cout<<mypair.first->first<<"\t"<<mypair.first->second<<endl;}//使用第二个迭代器if(mypair.second==map1.end()){cout<<"第二个迭代器,是>5的位置不存在"<<endl;}else{cout<<mypair.second->first<<"\t"<<mypair.second->second<<endl;}return0;}
4、multimap的基本操作
代码如下:
#include<iostream>#include<string>#include<map>usingnamespacestd;//multimap的重要应用场景:数据分组;classPerson{public:stringname;intage;stringtel;doublesaly;};intmain(void){Personp1,p2,p3,p4,p5;p1.name="王1";p1.age=31;p2.name="王2";p2.age=32;p3.name="张3";p3.age=33;p4.name="张4";p4.age=34;p5.name="赵5";p5.age=35;multimap<string,Person>map1;//sale部门map1.insert(make_pair("sale",p1));map1.insert(make_pair("sale",p2));//developmentmap1.insert(make_pair("development",p3));map1.insert(make_pair("development",p4));//financialmap1.insert(make_pair("Financial",p5));multimap<string,Person>::iteratorit;for(it=map1.begin();it!=map1.end();it++){//将age=32的人,名字更改为name32;if(it->second.age==32){it->second.name="name32";}cout<<it->first<<"\t"<<it->second.name<<endl;}cout<<"遍历结束"<<endl;//显示开发部的人员信息intnum=map1.count("development");cout<<"development部门人数:"<<num<<endl;cout<<"development部门员工信息"<<endl;multimap<string,Person>::iteratorit1=map1.find("development");inttag=0;while(it1!=map1.end()&&tag<num){cout<<it1->first<<"\t"<<it1->second.name<<endl;it1++;tag++;}return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。