1. C++ map
map容器是一种关联容器,即保存key-value对形式的容器。map是使用红黑树(一种更高级的平衡二叉树)来实现的,而非哈希,并且是以key为基准构建的红黑树,因此map可以认为是key有序的。
比如,下面是一个map的数据结构,为一颗平衡二叉树,可以看到,树的构建是以key为基准构建的,value作为key的附属品存在。因此查找key就相当于二叉查找树的复杂度: O ( l o g ( n ) ) O(log(n)) O(log(n));插入和删除则是在查找的基础上进行的,为保证树的平衡,需要有额外开销,但插入总体的复杂度依然为 O ( l o g ( n ) ) O(log(n)) O(log(n));而对于value的查找,则只能是 O ( n ) O(n) O(n)的复杂度。
那么红黑树是怎么回事,相信很多同学学完之后都没有什么使用的机会,所以应该忘得差不多了。红黑树是一种更宽松的平衡二叉树,并不要求高度差绝对为1,只要最高最低相差一倍就可以接受,而且相比于AVL树维护称为更低,查询效率也有保障,具体可以参考这篇文章。本文不打算探索map的红黑树是如何构建的,也不讨论map的源码,仅仅从理解低层原理的层面上加以简单解释。
所以你在使用map的时候,并不是在使用哈希,不同于python中的dict,所以一定要注意区别。C++中如果想使用类似于python中dict那样使用哈希实现的关联容器,可以用hash_map,在此之前,有必要了解一下C++中hash函数的特点及用法,毕竟是以它为基础构建的。
2. hash_map
2.1 C++ hash类模板
此部分参考:http://c.biancheng.net/view/523.html ,感兴趣可以直接看原文,这里只是总结性表述。
“哈希是用key生成整数值的过程”。哈希产生的值叫作哈希值或哈希码,类型为size_t。
hash<K>
类模板定义在functional头文件中。hash 模板定义了可以从 K 生成哈希值的函数对象。hash 实例的成员函数 operator()()
接受 参数key,然后返回 size_t 类型的哈希值。
下面是一个用 hash 生成整数的哈希值的示例:
std::hash<int> hash_int;// Function object to hash int
std::vector<int> n{
-5, -2, 2, 5, 10};
std::transform(std::begin(n), std::end(n),std:<