您的位置:首页 > 其它

__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中的一个功能,他提供了一个哈希表的实现。定义如下:
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区间的死循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: