#edu009. 学习材料 - map
学习材料 - map
#include<map>
map
容器是一个键值对 key-value
的映射。 其内部实现是一颗以 key
为关键码的红黑树。map
的 key
和 value
可以是任意类型,其中 key
必须定义“小于号”运算符,声明方法为:
map<key_type,value_type> name;
例如:
map<long long, bool> vis;
map<string, int> hash;
map< pair<int, int>, vector<int> >test;
在很多时候,map
容器被当作 Hash
表使用,建立从复杂信息 key
(如字符串) 到简单信息 value
(如一定范围内的整数)的映射。
因为map
基于平衡树实现,所以它的大部分操作的时间复杂度都在 级别,略慢于使用 Hash
函数实现的传统 Hash
表。 从 C++11
开始,STL
中新增 unordered_map
等基于 Hash
的容器,在后面介绍。
size()/empty()/clear()/begin()/end()
与 set
类似,分别为元素个数、是否为空、清空、首迭代器、尾迭代器。
迭代器
map
的迭代器与 set
一样,也是“双向访问迭代器”。对 map
的迭代器解除引用后,将得到一个二元组 pair<key_type,value_type>
.
insert()/erase()
与 set
类似,分别为插入、删除。 insert
的参数是 pair<key_type,value_type>
, erase
的参数可以是 key
或者 迭代器。
map<int,int> h;
h.insert(make_pair(1,2)),h.insert(make_pair(2,3));
map<int,int>::iterator it = h.begin();
map<int ,int> p = *it;
h.erase(it),h.erase(2);
cout << p.first << ' ' << p.second <<'\n';
find( )
h.find(x)
在变量名为 h 的 map
中查找 key 为 x 的二元组,并返回指向该二元组的迭代器。 若不存在,返回 h.end( )
。时间复杂度为 。
[] 操作符
h[key]
返回 key
映射到的 value
的引用,时间复杂度为 .
[ ] 操作符是 map
最吸引人的地方。 我们可以很方便地通过 h[key]
来得到 key
对应的 value
, 还可以对 h[key]
进行赋值操作,改变 key
对应的 value
.
需要特别注意的是,若查找的 key
不存在 ,则执行 h[key]
后,h 会自动新建一个二元组(key,zero),并返回 zero
的引用 。 这里 zero
表示一个广义“零值”,如整数 0、空字符串等。如果查找之后不对 h[key]
进行赋值,那么时间一长, h 会包含很多无用的“零值二元组”,白白地占用了空间,降低了程序运行效率。强烈建议读者在用 [] 操作符查询之前,先用 find
方法检查 key
的存在性。
【实例】用 map
统计字符串出现的次数
给定 个字符串, 个问题,每个问题询问一个字符串出现的次数。
, 每个字符串长度都不超过 。
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]);
}
学习完毕
{{ select(1) }}
- YES
- NO