Map是STL的一个关联容器,它提供一对一的数据处理能力。其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值,map依关键字而有序的。由于这个特性,在我们处理一对一数据的时候会很方便。下面介绍map的一般用法:
1、数据插入
通过pair插入数据
pair 是 一种模版类型。每个pair 可以存储两个值。这两种值无限制。也可以将自己写的struct的对象放进去。
pair声明
pair<int,string>p;
pari<double,int>p;
pair<int,string>p(4,"student");
pair<int,pair<int,int> >
#include <iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
map<int,string>student;
student.insert(pair<int,string>(1,"LeBron"));
student.insert(pair<int,string>(2,"Kevin"));
student.insert(pair<int,string>(3,"Blake"));
student.insert(pair<int,string>(4,"Noah"));
map<int,string>::iterator iter;
for(iter=student.begin();iter!=student.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
return 0;
}
数组插入
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<int,string>student;
student[0]="LeBron";
student[1]="Kevin";
student[2]="Blake";
student[3]="Noah";
map<int,string>::iterator iter;
for(iter=student.begin();iter!=student.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
return 0;
}
value_type插入
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<int,string>student;
student.insert(map<int,string>::value_type(1,"LeBron"));
student.insert(map<int,string>::value_type(2,"Kevin"));
student.insert(map<int,string>::value_type(3,"Blake"));
student.insert(map<int,string>::value_type(4,"Noah"));
map<int,string>::iterator iter;
for(iter=student.begin();iter!=student.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
return 0;
}
在通过数组插入数据的情况下,后插入数据与之前插入数据关键字一样时,之前插入数据就会被覆盖,而用另外两种则不会。
2、插入数据检测
pair<map<int,string>::iterator,bool>
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<int,string>student;
pair<map<int,string>::iterator,bool>test_insert;
test_insert=student.insert(pair<int,string>(1,"LeBron"));
if(test_insert.second)
cout<<"successful!"<<endl;
else
cout<<"Failure!"<<endl;
test_insert=student.insert(pair<int,string>(1,"Kevin"));
if(test_insert.second)
cout<<"successful!"<<endl;
else
cout<<"Failure!"<<endl;
map<int,string>::iterator iter;
for(iter=student.begin();iter!=student.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
return 0;
}
3、map遍历(正向与反向)
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<int,string>student;
student.insert(pair<int,string>(1,"LeBron"));
student.insert(pair<int,string>(2,"kevin"));
student.insert(pair<int,string>(3,"Pierce"));
student.insert(pair<int,string>(1,"Parker"));
map<int,string>::reverse_iterator iter;
for(iter=student.rbegin();iter!=student.rend();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
map<int,string>::iterator iter1;
for(iter1=student.begin();iter1!=student.end();iter1++)
cout<<iter1->first<<" "<<iter1->second<<endl;
return 0;
}
也可以通过数组方式遍历
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<int,string>student;
student.insert(pair<int,string>(1,"LeBron"));
student.insert(pair<int,string>(2,"kevin"));
student.insert(pair<int,string>(3,"Pierce"));
student.insert(pair<int,string>(1,"Parker"));
map<int,string>::reverse_iterator iter;
for(iter=student.rbegin();iter!=student.rend();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
map<int,string>::iterator iter1;
for(iter1=student.begin();iter1!=student.end();iter1++)
cout<<iter1->first<<" "<<iter1->second<<endl;
return 0;
}
4、通过关键字进行查找
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<int,string>student;
student.insert(pair<int,string>(1,"LeBron"));
student.insert(pair<int,string>(2,"Harden"));
student.insert(pair<int,string>(3,"Durant"));
student.insert(pair<int,string>(4,"Blake"));
map<int,string>::iterator iter;
iter=student.find(0);
if(iter!=student.end())
cout<<iter->first<<" "<<iter->second<<endl;
else
cout<<"Failure!"<<endl;
return 0;
}
5、删除数据,这里要用到erase(),他重载了三个函数,分别是用迭代器删除,用关键字删除以及利用迭代器成块删除。
#include <iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<int,string>student;
if(student.empty())
cout<<"Empty!"<<endl;
student.insert(pair<int,string>(1,"LeBron"));
student.insert(pair<int,string>(2,"Blake"));
student.insert(pair<int,string>(3,"Nash"));
student.insert(pair<int,string>(4,"Paul"));
student.insert(pair<int,string>(5,"Kobe"));
//erase1
map<int,string>::iterator iter;
iter=student.find(5);
student.erase(iter);
for(iter=student.begin();iter!=student.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
cout<<endl;
//erase2
student.erase(0);//删除成功会返回1,否则返回0
for(iter=student.begin();iter!=student.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
//erase3
cout<<endl;
student.erase(student.begin(),student.end());//全部删除,亦可以用clear()函数
if(student.empty())
cout<<"Empty!"<<endl;
return 0;
}
6、排序
由前面介绍,我们知道map有自动排序功能保证数据是依关键字有序的;但map只是定义了简单数据类型的排序,如果关键字为结构变量或者其他复杂数据类型时,就要自己定义数据大小的判定函数。
#include <iostream>
#include<string>
#include<map>
using namespace std;
typedef struct studentInfo
{
int ID;
string stu_name;
bool operator <(const studentInfo &a)const
{
if(ID<a.ID)
return true;
if(ID==a.ID)
return stu_name.compare(a.stu_name)<0;
return false;
}
}stuInfo;
int main()
{
map<stuInfo,int>stu;
stuInfo stuIn;
stuIn.ID=1;
stuIn.stu_name="LeBron";
stu.insert(pair<stuInfo,int>(stuIn,1));
stuIn.ID=2;
stuIn.stu_name="Durant";
stu.insert(pair<stuInfo,int>(stuIn,2));
map<stuInfo,int>::iterator iter;
for(iter=stu.begin();iter!=stu.end();iter++)
cout<<iter->first.ID<<" "<<iter->first.stu_name<<" "<<" "<<iter->second<<endl;
return 0;
}