需要的头文件:
需要的其他东西:
单独定义一个map:
map和其他STL容器在定义上有点不一样,因为map需要确定映射前类型(键key)和映射后类型(值 value ),所以需要在<>内填写两个类型,其中第一个是键的类型,第二个是值的类型。如果是int型映射到int型,就相当于是普通的int型数组。
而如果是字符串到整型的映射,必须使用string而不能用char数组:
map一般有两种方式访问: 通过下标访问或通过迭代器访问。下面分别讨论这两种访问方式。
(1)通过下标访问
和访问普通的数组是一样的,例如对一个定义为map<char , int > mp的 map来说,就可以直接使用mp[ ’ c ’ ] 的方式
来访问它对应的整数。于是,当建立映射时,就可以直接使用mp[ ‘c’ ]=20这样和普通数组一样的方式。
但是要注意的是,map中的键是唯一的,也就是说,下面的代码将输出30:
(2)通过迭代器访问
map迭代器的定义和其他STL容器迭代器定义的方式相同:
typename1和typename2就是定义map时填写的类型,这样就得到了迭代器it。
map迭代器的使用方式和其他STL容器的迭代器不同,因为map的每一对映射都有两个typename,
这就决定了必须能通过一个it来同时访问键和值。
事实上,map可以使用it->first来访问键,it->second来访问值。
在上面这个例子中,it->first是当前映射的键,it->second是当前映射的值。
你从上图可以发现一个特别有意思的现象:map会以键从小到大的顺序自动排序,即按a<m<r的顺序排列这三对映射。
这是由于map内部是使用红黑树实现的(set也是),在建立映射的过程中会自动实现从小到大的排序功能。
(1)find()
find(key)返回键为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数。
(2)erase()
erase()有两种用法: 删除单个元素,删除一个区间内的所有元素。
①删除单个元素
删除单个元素有两种方法:
mp.erase(it),it为需要删除的元素的迭代器。时间复杂度为O(1)。
mp.erase(key),key为欲删除的映射的键。时间复杂度为O(logN),N为map内元素的个数。
②删除一个区间内的所有元素。
mp.erase(first,last) , 其中 first为需要删除的区间的起始迭代器,而last则为需要删除的区间的末尾迭代器的下一个地址,
也即为删除左闭右开的区间[first,last)。时间复杂度为O(last-first)。
(3)size()
size()用来获得map中映射的对数,时间复杂度为O(1)。
(4)clear()
clear()用来清空map中的所有元素,复杂度为O(N),其中N为map中元素的个数。
- 需要建立字符(或字符串)与整数之间映射的数目,使用map可以减少代码量。
- 判断大整数或者其他类型数据是否存在的题目,可以把map当bool数组使用。
- 字符串和字符串的映射也很有可能会遇到。
延伸:map的键和值是唯一的,而如果一个键需要对应多个值,就只能用multimap。
另外C++11标准中还增加了unordered_map,以散列代替map内部的红黑树实现,
使其可以用来处理只映射而不按key排序的需求,速度要比map要快的多。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/haskellbc/58901.html