map与unordered_map都是c++ stl中的关联容器,二者的使用也都大体相同。不过在底层的实现上,map使用的是红黑树,unordered_map使用的则是hash表。c++
红黑树是一种相对平衡的二叉搜索树,而且其附加定义以下:算法
能够参考一下如下blog:
Red-Black Trees数组
相对于AVL平衡树,红黑树对于平衡性的要求没有那么高,因为其对于颜色的定义,任意节点左右子树的高度差在一倍以内(最长路径为节点红黑相间,最短路径为节点全黑),所以频繁插入和删除节点时,触发平衡调整的次数更少,平衡调整的过程也更易收敛。数据结构
而c++ stl中的map使用红黑树做为底层实现,对于map中的键值,它只要可以比较大小:如数值、字符串或其它可以支持大小比较的类就能够。函数
hash表,其实就是经过必定的算法:hash函数将原始数据转为一段固定长度的数值(表这个词其实没有具体意义,hash的存储方式有不少,如再链表法,如开放地址法的数据结构,表只是对于它们的一种笼统称呼)。blog
具体可见:什么是hash字符串
这里主要回答一下我本身长期的一个误区:get
即以前我一直觉得hash只适用于key-value这样的数据,而且认为hash表中只存储value,那么根据key的hash值寻找数据时,存在hash冲突的话,就无法知道当前hash值对应的value数据到底哪一个是对应于key的。hash
其实,hash也能够对于不是key-value这样的数据进行存储,好比就是一系列大量的数值或字符串,咱们可使用hash算法,而不是简单的数组顺序存储,为的是加快查找速度;而且对于key-value这样的数据,其实hash表中所存储的不是只有value,而是key-value这个键值对都存储了,这样在有hash冲突的状况下就能根据key值找到真正对应的value。io