map
map提供了一对一的关系
添加元素:
#include <iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
//map添加数据
//方法一,insert()函数插入pair数据
map<int,string>mapeg;
mapeg.insert(pair<int,string>(1,"str1"));
mapeg.insert(pair<int,string>(2,"str2"));
mapeg.insert(pair<int,string>(3,"str3"));
map<int,string>::iterator iter;
for(iter=mapeg.begin();iter!=mapeg.end();iter++)
{//迭代器遍历
cout<<iter->first<<" "<<iter->second<<endl;
}
//方法二,insert()函数插入value_tpye数据
map<int,string>mapeg2;
mapeg2.insert(map<int,string>::value_type(4,"str4"));
mapeg2.insert(map<int,string>::value_type(5,"str5"));
mapeg2.insert(map<int,string>::value_type(6,"str6"));
map<int,string>::iterator iter2;
for(iter2=mapeg2.begin();iter2!=mapeg2.end();iter2++)
{
cout<<iter2->first<<" "<<iter2->second<<endl;
}
//方法三,数组方式插入数据
map<int,string>mapeg3;
mapeg3[7]="str7";
mapeg3[8]="str8";
mapeg3[9]="str9";
map<int,string>::iterator iter3;
for(iter3=mapeg3.begin();iter3!=mapeg3.end();iter3++)
{
cout<<iter3->first<<" "<<iter3->second<<endl;
}
return 0;
}
查找元素和删除元素
#include <iostream>
#include<map>
using namespace std;
int main()
{
//查找元素
//方法一,find()函数
/*find()函数返回一个迭代器指向键值为key的元素,
若没有找到,则返回指向map尾部的迭代器*/
map<int,float>a;
a[1]=12.2;
a[2]=12.4;
map<int,float>::iterator it;
it=a.find(1);
a.erase(it);//删除元素
/*erase()删除,可在括号里写键值,
也可以写相应的迭代器iterator位置*/
for(it=a.begin();it!=a.end();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
排序,map中的sort问题
map中的元素是自动按Key升序排序,所以不能对map用sort函数;
STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int 型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过 不去,可重载小于号解决。
#include <iostream>
#include<map>
using namespace std;
typedef struct tagStudentinfo
{
int niD;
string strName;
bool operator < (tagStudentinfo const& _A) const
{ //这个函数指定排序策略,按niD排序,如果niD相等的话,按strName排序
if(niD < _A.niD) return true;
if(niD == _A.niD)
return strName.compare(_A.strName) < 0;
return false;
}
}Studentinfo, *PStudentinfo; //学生信息
int main()
{
int nSize; //用学生信息映射分数
map<Studentinfo, int>mapStudent;
map<Studentinfo, int>::iterator iter;
Studentinfo studentinfo;
studentinfo.niD = 1;
studentinfo.strName = "student_one";
mapStudent.insert(pair<Studentinfo, int>(studentinfo, 90));
studentinfo.niD = 2;
studentinfo.strName = "student_two";
mapStudent.insert(pair<Studentinfo, int>(studentinfo, 80));
for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)
cout<<iter->first.niD<<' '<<iter->first.strName<<' '<<iter->second<<endl;
return 0;
}
运行结果:
1 student_one 90
2 student_two 80
multimap
multimap特性及用法与map完全相同,唯一的差别在于:
multimap允许重复键值的元素插入容器(使用了insert_equal函数)
multimap没有重载operator [] 功能。
因此:键值key与元素value的映照关系是多对多的关系。
添加元素
#include <iostream>
#include<map>
using namespace std;
//multimap插入与遍历
int main()
{
multimap<int,string>a;
multimap<int,string>::iterator it;
a.insert(pair<int,string>(1,"str1"));
a.insert(pair<int,string>(2,"str2"));
a.insert(pair<int,string>(3,"str3"));
a.insert(pair<int,string>(3,"str3"));//插入相同重复元素
//遍历
for(it=a.begin();it!=a.end();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
运行结果
1 str1
2 str2
3 str3
3 str3
删除和查找
#include <iostream>
#include<map>
using namespace std;
//multimap删除和查找
int main()
{
multimap<int,string>a;
//a[1]=12.2;//error
//a[2]=12.4;//error,multimap不能重载[]
a.insert(pair<int,string>(1,"str1"));
a.insert(pair<int,string>(2,"str2"));
a.insert(pair<int,string>(3,"str3"));
multimap<int,string>::iterator it;
it=a.find(1);
a.erase(it);//删除元素
/*erase()删除,可在括号里写键值,
也可以写相应的迭代器iterator位置*/
for(it=a.begin();it!=a.end();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}