map
映射是指两个集合之间的元素的相互对应关系。通俗来讲,就是一个元素对应另一个元素。比如我们的名字和班级之间可以有映射关系
我们称其中的姓名集合为关键词集合(key),班级集合为值集合(value).
在c++中我们常用的映射为map
引用库
在c++中map的实现在一个
头文件,在代码开头引入这个头文件,并且加上一句using namespace std;
#include <map>
using namespace std;
构造一个映射
在c++中,我们构造一个map的语句为:map<T1,T2>m;。这样我们定义了一个名为m的从T1类型到T2类型的映射。初始的时候m是空映射
插入一对映射
在c++中通过insert()函数向集合中插入一个新的映射,参数是一个pair
pair是一个标准库类型,定义在头文件utility中,可以看成有两个成员变量first和second的结构体,并且重载了<运算符(先比较first大小,如果一样再比较second).当我们创建一个pair时,必须提供两个类型
我们可以向这样定义一个保护string和int的pair
pair<string,int>p;
make_pair(v1,v2)函数返回由v1和v2初始化的pair,类型可以从v1和v2的类型推断出来。
我们向映射中加入新映射对的时候就是通过插入pair来实现的。如果插入的key之前已经存在了,将不会用插入的新的value替代原来的value,也就是这次插入是无效的
#include <map>
#include <string>
#include <utility>
using namespace std;
int main()
{
map<string, int>dict;//dict是一个string到int的映射,存放每个名字对应的班级号,初始化为零
dict.insert(make_pair("tom", 1));//{“tom”->1}
dict.insert(make_pair("jane", 2));//{"tom"->1,“jane”->2}
return 0;
}
访问映射
在c++中访问映射和数组一样,直接用【】就能访问。比如dict【“tom”】就可以获取“tom“的班级了。而这里有一个比较神奇的地方。如果没有对”tom“做出映射的话,此时你访问dict【“tom”】,系统会自动为“tom”生成一个映射,其value为对应类型的默认值(比如int的默认值是0,string的默认值是空字符串)
并且我们可以之后再给映射赋予新的值,比如dict【“tom”】=3
#include <iostream>
#include <map>
#include<string>
using namespace std;
int main()
{
map<string, int>dict;
dict["tom"] = 1;//tom->1
dict["jane"] = 2;//jane->2
cout << "tom is in class" << dict["tom"] << endl;
cout << "jane is in class" << dict["jane"] << endl;
return 0;
}
判断关键字是否存在
在c++中,使用count()函数,如果关键词存在,返回1,否则会返回0.
遍历映射
#include <iostream>
#include <map>
#include<string>
using namespace std;
int main()
{
map<string, int>dict;
dict["tom"] = 1;//tom->1
dict["jane"] = 2;//jane->2
for (map<string, int>::iterator it = dict.begin(); it != dict.end(); it++)
{
cout << it->first << "->" << it->second << endl;
}
return 0;
}
注意,在c++中遍历map是按照关键词从小到大遍历的,这一点和set有些共性
清空
c++中只需要clear()函数就可清除map和其占用的内存