原文链接:STL中map的使用详解
发布时间:2018-11-14 18:34:04
map的本质
map本质上一个平衡二叉树(更准确地说是红黑树),那么每个节点存放一个数据,默认是key和value打包成一个数据pair,以pair的形式存放在节点的,由此来看,pair里面可以放任何数据,前提是pair必须可以比较大小,当然也可以自定义比较函数,而map的第三个参数就是指定自定义key的比较函数的。
map的定义
1 | //map的定义 |
map的特点
- map本质是一个红黑树
- 每个节点存放一个数据
- map的节点是有序的
正是因为map的内部数据是有序的,才能保证map的高效查找,数据有序,pair必须是可比较的,必须有比较函数。
如果key是整数、字符串,则不需要提供比较函数,但是如果key是自己定义的数据类型,比如是一个结构体,那就需要自己编写比较函数了。
自定义排序函数
1 |
|
输出:
1 | uid=1004, name:james |
函数对象
就是定义的类重载了operator() 操作符。对象可以像函数指针一样使用。
1 |
|
函数对象可以代替函数指针,比指针更加灵活,因为对象是可以有状态的。
标准库定义了一组算术、关系与逻辑函数对象类
例如 less、greater
1 | int main() |
输出:
1 | result1=1 |
pair的定义
1 | namespace std { |
insert操作
map的insert表示插入数据,如果key已经存在,将不做任何操作,key不存在,则插入数据。
1 | pair<iterator,bool> insert (const value_type& val); |
关于返回值:
- 返回值是一个pair
- pair 的 first 表示 在map中,等于k值在map中迭代器
- pair的second的是一个bool值,false表示没有插入key,说明key已经存在map中了,true表示插入成功
由以上可知,insert操作,和通过下标索引操作还是不一样的。
通过下标操作一定会修改map,例如map[k1]=v1,如果k1存在,会修改k1的值,k1不存在,则插入key的键值对。