[STL] __gnu_cxx::hash_map使用中的一些问题,

今天看《libstdc++ manual 20110201》中提到这个hash_map是为了向后兼容SGI/HP的代码,但是已经被废弃了,取而代之的是C++0x中的unordered_map/unordered_multimap,在tr1文件夹中(老版本的编译器一般不带这个文件夹)。

==============================================================================

这个不是gcc标准库的一部分,而是扩展ext中的一个功能,他提供了一个哈希表的实现。定义如下:

template<class _Key, class _Tp, class _HashFcn = hash<_Key>, class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> > class hash_map;

可见,如果定义完整的hash_map,需要提供<key类型,value类型,哈希函数,key相等判断函数,value类型内存分配器>等5个模板参数,由于后三个都有默认值,所以一般我们只需要提供前两个。

1> 定义__gnu_cxx::hash_map<string, int> myHash;不会出错,然而一旦对myHash进行操作,就会出现编译错误,“instantiated from here”,这是因为gnu版本的hash_map只实现了有限的几个hash模板函数(见第三个模板参数,这些函数在hash_fun.h中),而这些函数里包括hash<const char*>,但是不包括hash<std::string>的实例化。解决办法是定义哈希表前自己定义一个实例,这样编译器就知道调用这个函数了。

namespace __gnu_cxx { template<> struct hash<std::string> { size_t operator()(const std::string &s) const{ return hash(s.c_str()); } } }

2> 发现了gnu帮我们实现了hash<const char*>/hash<char*>的版本,那么实际上,有时候就可以直接利用这个版本了。然而还是会出现新的问题:

__gnu_cxx::hash_map<char*, int> myHash; char name1[10] = "panda"; char name2[10] = "panda"; myHash[name1] = 1; __gnu_cxx::hash_map<char*, int>::iterator hit = myHash.find( name2 ); if( myHash.end() == hit ) printf( "Not Find\n" );

你会发现,虽然name1和name2都是panda,但是插入了name1,用name2去查找时,还是查无结果。这是涉及到第四个模板参数,判断key相等,默认的是std::equal_to,而这个函数的定义是用operator==来进行判断的,指针的相等当然就是地址一样了,而name1和name2的地址显然不同。解决办法是用自己指定的函数模板替代默认的。

template <class _Tp> struct my_equal_to : public binary_function<_Tp, _Tp, bool> { bool operator()(const _Tp& __x, const _Tp& __y) const { return strcmp( __x, __y ) == 0; } }; // 定义哈希表时,用如下方法(这次不能跳过第三个模板参数,所以要指定): __gnu_cxx::hash_map< char*, int, __gnu_cxx::hash<char*>, my_equal_to<char*> > myHash;

3> 遍历__gnu_cxx::hash_map出现了死循环,这个问题并不常见,然而遇到了可能真让人摸不到头脑。还好我之前见过这篇帖子,没有在这里陷很久。

http://blog.csdn.net/tototony/article/details/5689882

这个问题简单说来,就是gnu的实现是,内部有个_M_Cur指针指示当前位置A,每次计算operator++,都用当前位置的key调用hash函数计算下一个位置B,如果key传入hash_map以后,又在外部将其内容破坏,导致hash函数计算后的B位置在A位置之前,那么从B到达A以后,又会跳回B,形成B-A区间的死循环。

转载于:https://www.cnblogs.com/mtcnn/archive/2013/03/01/9410114.html

__gnu_cxx::hash_map使用中的一些问题相关推荐

  1. 在GCC和Visual Studio中使用hash_map

    熟悉STL或熟悉ACM/ICPC的话,其中的set, map, multiset, multimap一定用过无数次了,它们都是用平衡二叉树(红黑树)实现的,复杂度为O(lgn).我们也知道set, m ...

  2. C++中的Hash容器总结

    散列Hash函数是一种特殊的映射函数, 散列表Hash Table由散列函数所产生的一种数据结构. 这是一种非常重要的数据结构. 首先, 先了解散列表在数据结构方面的基础: 散列表是用于存储动态集的一 ...

  3. STL6大标准库的关系和作用

    STL六大组件简介 1.容器(Containers):各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据,STL容器是一种Class Template,就体积而言,这一部 ...

  4. POJ 2785 有多少种4个数相加等于0的方案(二分查找 or hash)

    文章目录 1.二分查找法 1.1 思路: 1.2 AC代码 2.hash查找法 2.1 思路: 2.2 Wrong Answer 代码 2.3 Time Limit Exceeded 代码 2.4 偷 ...

  5. [美团 CodeM 初赛 Round A]最长树链

    题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...

  6. ZJOI2017 讲课Day1笔记

    额,参考一下大神的笔记.... 地址 http://www.cnblogs.com/ARZhu-NOIpAK/p/6596879.html Day1 2017-3-24 3:34:43 苟-- 富贵 ...

  7. hash_map allocator

    1 hash_map定义在__gnu_cxx下 template<class _Key, class _Tp, class _HashFcn = hash<_Key>,        ...

  8. map,hash_map和unordered_map效率比较

    转载地址:https://blog.csdn.net/whizchen/article/details/9286557 原理介绍 map介绍 map是STL的一个关联容器,它提供一对一(其中第一个可以 ...

  9. Ajax+SpringBoot+Thymeleaf使用中遇到的跳转页面问题

    前言:这周在使用 Ajax+Thymeleaf 时遇到一个问题,折腾了我很久,在此记录一下 Ajax+SpringBoot+Thymeleaf使用中遇到的跳转页面问题 问题描述 我的目的:通过 Aja ...

最新文章

  1. hbase hbck命令示例
  2. MATLAB的xlsread无法读入数据问题
  3. java 连接ldap_ldap java 连接demo
  4. 2017-10-06-构建之法:现代软件工程-阅读笔记
  5. 连续出现的字符(信息学奥赛一本通-T1148)
  6. KaggleTianChi分类问题相关算法快速实现
  7. 如何VARCHART XGantt编写PDF文件
  8. Android扩展知识 - 减轻C盘压力,扩大C盘空闲容量
  9. 定了,6大领域93个开源任务,阿里开源导师带你参与中科院开源之夏2022
  10. qlv转MP4,基于windows命令实现
  11. 域名设置A记录或CNAME记录,但无法被解析,可能是因为状态为:clientHold
  12. java调adobe打印_Java报表工具打印方案集锦 | 改变自己
  13. XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML
  14. 边框,多层背景,内补白与外补白
  15. 杰理之BQB 的 profile 测试【篇】
  16. OpenCV笔记11:利用HSV颜色空间进行目标检测和目标跟踪
  17. 远程--不用关闭防火墙,也可以远程连接(远程桌面连接不上怎么办)
  18. 推荐6款地球表面最强软件的电脑软件
  19. swf用html怎么写,swfobject.js html中写入一个swf文件
  20. 有关于中通公司需要提交的面试题答案

热门文章

  1. C++ 输入和输出IO
  2. opencv Shi-Tomasi角检测
  3. socket通信基础知识
  4. airtest运行脚本_airtest之脚本批量运行
  5. 23、90秒快速“读懂”STP(生成树)工作原理
  6. VMware ESXi/ESX 的内部版本号和版本 (2143832)-2020-10-27更新
  7. Redis学习总结(12)——Redis常见面试题再总结
  8. Spring Boot学习总结(3)——SpringBoot魅力所在
  9. Spring学习总结(13)——Spring+Log4j+ActiveMQ实现远程记录日志
  10. Linux学习总结(13)——在阿里云的ubuntu上部署个人服务