概述
map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据具有一对一的映照关系,且键值具有唯一性,不能重复出现。所以,我们可以将map看作是由键值标识元素的元素集合(猛地一看是不是跟数组用下标来识别元素差不多...)。
map可以通过一个键值来快速决定一个元素,因此非常适合于需要按照键值查找元素的容器。
由于map的数据结构和set一样都是采用红黑树来实现的,所以它也具有根据键值将元素自动排序的功能。其用法也与 set 基本相似。
下面我们来简单介绍一下map的用法
头文件
#include<map>
注:map 和 multimap 都包含在这个头文件里面,而且两者的用法基本一样。由于 multimap 可以插入相同的键值,所以它的插入、删除、查找会和map有所区别,其他操作就基本一样了。
定义对象
map<string,int> mp;
multimap<string,int> mmp;定义了一个键值类型为string,映照数据类型为int的map/multimap对象
注:尖括号里的两种类型需用逗号隔开,不可以用空格。
插入元素
//map对象插入元素
mp["str"]=n; //用下标运算符插入
mp.insert("str",n) //用insert插入元素,
//multimap对象插入元素
mmp.insert(pair<string,int>("str",n));//区别就是需要用到pari(),
注:上面的插入过程中,"str"为键值,n为映照数据。map会自动根据键值对元素排序,默认为升序。当然也可以自定义比较规则(下面会有介绍)。
删除和清空元素
erase(it); //通过迭代器删除指定对象
erase(it_1,it_2) //删除一个迭代器区间的所有元素,区间左闭右开
//上面两种方式会返回指向下一元素的迭代器
erase("str"); //删除给定键值的元素,并返回删除的个数
clear() //清空元素
注:返回元素个数这个功能用在multimap比较有意义。
元素的遍历
mp<string,int>::iterator it; //定义一个迭代器
for(it=mp.begin();it!=mp.end();it++)
{
cout<<(*it).first<<" "<<(*it).second<<endl;
}
注:需要注意的就是这里需要用到first(代表键值)和second(代表映照数据),而且他们两个后面不能跟小括号,如:(*it).first(),这是错误的!另,反向遍历需要用到reverse_iterator、rbegin()和rend()
元素查找
find(); //找到则返回指定该键值的迭代器,否则返回end()
count(); //返回指定键值出现的次数
count_if(); //在序列中统计与某谓词匹配(满足某种条件)的次数
upper_bound();//返回键值大于给定键值的第一个位置,是一个迭代器
lower_bound();//返回第一个大于或等于给定键值的元素的迭代器
注:map用find()搜索元素的速度是极快的!在multimap中,由于存在相同键值,所以find()就返回重复键值中第一个元素的迭代器。
自定义比较函数
分为结构体和非结构体的情况
//非结构体
struct comp
{
bool operator () (const int &a,const int &b)//键值为int型
{
return a>b;//大顶堆,降序排
}
};
引用方法:map<string,int,comp> mp;
//结构体
struct lei
{
string str;
int score;
bool operator < (const lei &a)const
{
return a.score<score;
}
};
引用方法:map<lei int> mp;
map用于数字分离
代码示例
注:有些编译器(如vc++6.0)编译下列代码时会出现4786警告,该警告并不影响结果。可以用#pragma warning(disable:4786)语句来强制忽略4786警告
#pragma warning(disable:4786)
#include<string>
#include<map>
#include<iostream>
using namespace std;
int main()
{
map<char,int> m;
for(int i=0;i<10;i++)
{
m['0'+i]=i;
}
string str="6234";
int sum=0;
for(int j=0;j<str.size();j++)
{
sum+=m[str[j]];
}
cout<<"sum = "<<sum<<endl;
return 0;
}
输出如下: