map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。map内部通过自建一颗红黑树进行数据组织的,这颗树具有对数据自动排序的功能,即map内部所有的数据都是有序的。
1.map的构造
map共提供了6个构造函数,常用构造方式如下:
map<int, string> mp;
2.数据插入
<1>用insert函数插入pair数据
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
map<int, string>::iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(pair<int, string>(2, "value_2"));
mp.insert(pair<int, string>(3, "value_3"));
for(iter = mp.begin(); iter != mp.end(); iter++)
{
cout<<iter->first<<" "<<iter->second<<endl;
}
return 0;
}
<2>用insert函数插入value_type数据
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
map<int, string>::iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(map<int, string>::value_type(2, "value_2"));
mp.insert(map<int, string>::value_type(3, "value_3"));
for(iter = mp.begin(); iter != mp.end(); iter++)
{
cout<<iter->first<<" "<<iter->second<<endl;
}
return 0;
}
<3>数组方式插入数据
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
map<int, string>::iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(map<int, string>::value_type(2, "value_2"));
mp[3]="value_3";
mp[4]="value_4";
for(iter = mp.begin(); iter != mp.end(); iter++)
{
cout<<iter->first<<" "<<iter->second<<endl;
}
return 0;
}
以上三种用法的区别在于:当map中有这个关键字时,insert操作是插入不了数据的,但用数组方式可以通过覆盖以前该关键字对应的值进行插入。
3.map的遍历
<1>前向迭代器遍历,如上程序所示。
<2>反相迭代器遍历,如下程序所示。
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
map<int, string>::reverse_iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(map<int, string>::value_type(2, "value_2"));
mp[3]="value_3";
mp[4]="value_4";
for(iter = mp.rbegin(); iter != mp.rend(); iter++)
{
cout<<iter->first<<" "<<iter->second<<endl;
}
return 0;
}
运行结果:
4 value_4
3 value_3
2 value_2
1 value_1
<3>数组方式遍历
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
//map<int, string>::reverse_iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(map<int, string>::value_type(2, "value_2"));
mp[3]="value_3";
mp[4]="value_4";
//for(iter = mp.rbegin(); iter != mp.rend(); iter++)
int mpSize = mp.size();
for(int i=1;i<=mpSize;i++)
{
//cout<<iter->first<<" "<<iter->second<<endl;
cout<<mp[i]<<endl;
}
return 0;
}
运行结果:
value_1
value_2
value_3
value_4
4.数据的查找
<1>count函数判定关键字是否出现
count函数返回值只有两个:0或1,0表示关键字未出现,1表示出现。该方法无法定位关键字的位置。
<2>find函数来定位关键值出现位置
find函数返回一迭代器,关键值出现,返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
map<int, string>::iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(pair<int, string>(2, "value_2"));
mp.insert(pair<int, string>(3, "value_3"));
iter =mp.find(2);
if(iter != mp.end())
cout<<"the value is: "<<iter->second<<endl;
else
cout<<"Not find!"<<endl;
return 0;
}
5.数据的删除
数据的删除操作通过erase函数实现。
<1>通过迭代器删除
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
map<int, string>::iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(pair<int, string>(2, "value_2"));
mp.insert(pair<int, string>(3, "value_3"));
iter =mp.find(2);
if(iter != mp.end())
mp.erase(iter);
for(iter=mp.begin();iter!=mp.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
return 0;
}
<2>通过关键字删除
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
map<int, string>::iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(pair<int, string>(2, "value_2"));
mp.insert(pair<int, string>(3, "value_3"));
//iter =mp.find(2);
//if(iter != mp.end())
// mp.erase(iter);
mp.erase(2);
for(iter=mp.begin();iter!=mp.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
return 0;
}
通过迭代器可以成片删除数据,根据STL的特性删除区间是一个左闭右开的区间
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> mp;
map<int, string>::iterator iter;
mp.insert(pair<int, string>(1, "value_1"));
mp.insert(pair<int, string>(2, "value_2"));
mp.insert(pair<int, string>(3, "value_3"));
mp.insert(pair<int, string>(4, "value_4"));
iter =mp.find(3);
//if(iter != mp.end())
// mp.erase(iter);
mp.erase(mp.begin(),iter);
for(iter=mp.begin();iter!=mp.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
return 0;
}
6.其他常用函数
size()函数用来返回map的大小,empty()函数用来返回map是否为空,clear()函数用来清空map。