C++ STL map(映射)

头文件#include,当然,万能库就不用我多说了吧。。

介绍:map容器是一个键 (key) 到值 (value) 的映射。因为重载了 [ ] 运算符,map像是数组的“高级版”。map的key和value可以是任意类型,其中key必须定义“小于号”运算符。例如可以用一个map month_name 来表示“月份名字到月份编号”的映射,然后用month_name["July"]=7;这样的方式来赋值。

声明

mapname;

例如:

map<long long,bool>vis;
map<string,int>hash;
mapint,int>,vector<int>>test;

在很多时候,map容器被当作Hash表使用,建立从复杂信息key(如字符串)到简单信息 value(如一定范围内的整数)的映射。
因为map基于平衡树实现,所以它的大部分操作的时间复杂度都在 O(logn) O ( l o g n ) 级别,略慢于使用 Hash函数实现的传统Hash表。从C++11开始,STL中新增了 unordered_map 等基于Hash的容器,但部分算法竞赛并不支持C++11标准,这里就不再介绍这些新容器。

size/empty/clear/begin/end
与set类似,分别为元素个数、是否为空、清空、首迭代器、尾迭代器。

迭代器
map 的迭代器和 set 一样,也是“双向访问迭代器”。对 map 的迭代器解除引用后,将得到一个二元组 pair

insert/erase
与set类似,分别为插入、删除。insert的参数是pair ,erase的参数可以是pair或者迭代器。

map<int,int > h;
h.insert(make_pair(1,2)),h.insert(make_pair(2,3));
map<int,int > :: iterator it=h.begin();
pair<int,int > p=*it;
h.erase(it),h.erase(make_pair(2,3));
cout<' '<

find
h.find(x) 在变量名为h 的map 中查找key 为 x 的二元组,并返回指向改二元组的迭代器。若不存在,返回h.end()。时间复杂度为 O(logn) O ( l o g n )

[ ] 操作符
h[key]返回key映射到的value的引用,时间复杂度为 O(logn) O ( l o g n )
[ ]操作符是map最吸引人的地方。我们可以很方便地通过 h[key] 来得到 key 对应的value,还可以对 h[key] 进行赋值操作,改变key对应的value。
需要特别注意的是,若查找的key不存在,则执行 h[key] 后,h会自动新建一个二元组(key,zero),并返回zero的引用。这里zero表示一个广义“零值”,如整数0、空字符串等。如果查找后不对 h[key] 进行赋值,那么时间一长,h 会包含很多无用的“零值二元组”,白白地占用了空间,降低了程序运行效率。强烈建议读者在用 [ ] 操作符查询之前,先用 find 方法检查 key 的存在性。

[实例] 用map统计字符串出现的次数
给定 n 个字符串,m 个问题,每个问题询问一个字符串出现的次数。
n<=20000,m<=20000,每个字符串的长度都不超过20.

map<string,int> h;
char str[25];
for(int i=1;i<=n;i++){
    scanf("%s",str);
    h[str]++;
}
for(int i=1;i<=m;i++){
    scanf("%s",str);
    if(h.find(str)==h.end())puts("0");
    else printf("%d\n",h[str]);
}

提示
set头文件中的set和map头文件中的map分别是集合和映射。二者都支持insert、find、count和remove操作,并且可以按照从小到大的顺序循环遍历其中的元素。map还提供了“[ ]”运算符,使得 map 可以像数组一样使用。事实上,map 也称为“关联数组”。

你可能感兴趣的:(STL)