map是C++标准库的一个关联容器,是一个模板类。
它提供一对一(其中第一个可以称为关键字,每个关键字只能在 map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。map就是从键( key)到值( value)的映射。因为重载了[ ][ ]运算符,map像是数组的“高级版”。
例如可以用一个 map<string, int>month_name 来表示“月份名字到月份编号”的映射,然后用 monthname["July"]=7 这样的方式来赋值。
这里说下map 内部数据的组织,map 内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map 内部所有的数据都是有序的,后边我们会见识到有序的好处。map 是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。
如果没有map,我们利用结构体数组查找某个键对应的值,就需要遍历整个数组,这样无疑很低效。map的内部实现是一种名为红黑树的数据结构,当我们将不同的键值放入 map,这种数据结构会自动将所有键值变为有序的(按照键key排序)。
因为有序,当我们查找某个值的时候,就无须遍历整个数组,而是可以用二分的方法快速定位。还是以上面的数据为例,我们想要查找4对应的值,查找过程会先找到中间的7,发现7比4大,因而只在前一半中进行查找,这样每次查找的范围会缩小一半,关于二分的知识,我们会在后续课程中讲解,这里不展开介绍。
map并不是唯一支持从 key 找 value的数据结构,还有一种更快的以空间换时间的方法叫做 hash。
map的功能
自动建立 Key - value 的对应。 key 和value 可以是任意你需要的类型。
根据 key值快速查找记录,查找的复杂度基本是 Log(N)Log(N)
1.快速插入 Key −Value记录
2.快速删除记录。
3.根据 Key修改 value记录
4.遍历所有记录。
使用map
定义
map<string,int> mp;//定义,mp为名称
mp.size() //返回map的大小
mp.empty() //判断是否为空
mp.clear() //清空map
mp.begin() //返回第一组映射的位置
mp.end() //返回最后一组映射的下一个位置
mp.count(x) //返回关键字x是存在映射
mp.erase(it) //删除迭代器it指向的映射
mp.insert({char,int})//新建一组char到int的映射