前言:
映射是指两个集合之间的元素相互对应关系。通俗地说,就是一个元素对应另外一元素。
我们称其中的姓名集合为关键字集合(key),班级集合为值集合(value)。
注意一个key不能对应多个value,这一点和函数法则一样!
在C++中我们常用的映射是map。
一、构造一个映射
在C++中,我们构造一个map的语句是:map<T1,T2> m;这样我们定义了一个名为m的从T1类型到T2类型的映射。初始的时候m是空映射比如map<string,int> m构造了一个字符串到证书的映射,这样我们可以把一个字符串和一个整数关联起来。
二、插入一个映射(比较特殊)
通过insert()函数向集合中插入一个新的映射,参数是一个pair。
首先跟其他数据结构类似,都是需要映射名作为引线,但insert()里面还需要参数!
pair是一个标准库类型,定义在头文件<utility>中
insert()里面的参数是make_pair(,)
值得注意:如果插入的key之前已经存在了,将不会用插入的新的value替代原来的value,也就是这次插入是无效的!
三、访问映射
在C++中访问映射和数组一样,直接用【】就能访问。比如a["Tom"]就可以获取Tom的班级。而这里有一个比较神奇的地方,如果没有对“Tom”做过映射的话,此时你访问a["Tom"],系统将会自动为“Tom”生成一个映射,其value为对应类型的默认值(比如int的默认值就是0,string默认值是空字符串)。
并且我们可以之后再给映射赋予新的值,你如a["Tom"]=3,这样为我们提供了另一种方便的插入手段。实际上我们常常通过下标访问的方式插入映射,而不是通过insert插入一个make_pair来实现!
四、判断关键字是否存在
count()函数判断,若存在就返回1,不存在返回0
五、遍历映射
map的迭代器的定义和set差不多,map<T1,T2>::iterator it就定义了一个迭代器,其中T1,T2分别是key和value的类型。c++通过迭代器可以访问集合中的每一个元素。这里的迭代器指向的元素是一个pair,有first和second两个成员变量,分别代表一个映射的key和value
我们用->运算符来获取值。it->first和(*it).first的效果一样,就是获取迭代器it指向的pair里first成员的值
#include<string>
#include<map>
#include<utility>
using namespace std;//一定不要忘
int main()
{
map<string, int> a;
a.insert(make_pair("Tom", 1));
a.insert(make_pair("Zone", 2));
a.insert(make_pair("Mary",1));
a["Tom"] = 4;//可以直接用数组下标的方式进行定义,更为方便
for (map<string,int>::iterator it=a.begin();it!=a.end();it++)
{
cout << it->first << "->" << it->second << endl;//按照first已经排好序了
}
return 0;
}