__gnu_cxx::hash_map使用中的一些问题
2013-03-01 15:18
344 查看
[STL] __gnu_cxx::hash_map使用中的一些问题,
今天看《libstdc++ manual 20110201》中提到这个hash_map是为了向后兼容SGI/HP的代码,但是已经被废弃了,取而代之的是C++0x中的unordered_map/unordered_multimap,在tr1文件夹中(老版本的编译器一般不带这个文件夹)。
==============================================================================
这个不是gcc标准库的一部分,而是扩展ext中的一个功能,他提供了一个哈希表的实现。定义如下:
2>
发现了gnu帮我们实现了hash<const char*>/hash<char*>的版本,那么实际上,有时候就可以直接利用这个版本了。然而还是会出现新的问题:
3>
遍历__gnu_cxx::hash_map出现了死循环,这个问题并不常见,然而遇到了可能真让人摸不到头脑。还好我之前见过这篇帖子,没有在这里陷很久。
/article/10198838.html
这个问题简单说来,就是gnu的实现是,内部有个_M_Cur指针指示当前位置A,每次计算operator++,都用当前位置的key调用hash函数计算下一个位置B,如果key传入hash_map以后,又在外部将其内容破坏,导致hash函数计算后的B位置在A位置之前,那么从B到达A以后,又会跳回B,形成B-A区间的死循环。
今天看《libstdc++ manual 20110201》中提到这个hash_map是为了向后兼容SGI/HP的代码,但是已经被废弃了,取而代之的是C++0x中的unordered_map/unordered_multimap,在tr1文件夹中(老版本的编译器一般不带这个文件夹)。
==============================================================================
这个不是gcc标准库的一部分,而是扩展ext中的一个功能,他提供了一个哈希表的实现。定义如下:
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*>的版本,那么实际上,有时候就可以直接利用这个版本了。然而还是会出现新的问题:
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出现了死循环,这个问题并不常见,然而遇到了可能真让人摸不到头脑。还好我之前见过这篇帖子,没有在这里陷很久。
/article/10198838.html
这个问题简单说来,就是gnu的实现是,内部有个_M_Cur指针指示当前位置A,每次计算operator++,都用当前位置的key调用hash函数计算下一个位置B,如果key传入hash_map以后,又在外部将其内容破坏,导致hash函数计算后的B位置在A位置之前,那么从B到达A以后,又会跳回B,形成B-A区间的死循环。
相关文章推荐
- [STL] __gnu_cxx::hash_map使用中的一些问题
- 32bit g++编译64位整数作为key的__gnu_cxx::hash_map的编译错误问题
- 32bit g++编译64位整数作为key的__gnu_cxx::hash_map的编译错误问题
- __gnu_cxx::hash_map死循环分析
- hash_map一些纠结的问题
- 使用map和hash_map的效率问题
- isnan和hash_map使用问题解决方法
- 使用map和hash_map的效率问题
- dense_hash_map使用过程中一些错误信息
- 记录一下 __gnu_cxx::hash_map传一个新allocator的写法
- googleMap sdk for iOS的一些使用 介绍问题
- cocos2d-x 学习笔记之Tiled Map地图使用时的一些问题
- 记录一下 __gnu_cxx::hash_map传一个新allocator的写法
- __gnu_cxx::hash_map死循环一例
- c++避免使用hash_map有性能 问题
- 介绍win7使用的一些问题
- 一些主流IDE(VC6、VS2010、Code::Blocks、Eclipse)使用过程中常见问题集锦
- ListView addHeaderView和addFooterView使用上的一些问题
- C++使用hash_map时警告
- 使用Collections.emptyMap()引起的一个奇怪的问题