C++ map和hash_map学习第二重——数据结构探索

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:<
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值