hash_map in Linux error

 

在VS2k5下写了一个小的prototype,用到了STL: hash_map。运行一切正常。还指望cp到Linux环境下直接可以运行起来,结果编译后刷出满屏error。
O SHIT。

看看error,恩?using namespace stdext的stdext不认识??!MSDN上说的明明白白:CPP委员会已经把hash_map系列封装在stdext里了……
居然不听老大的,狂鄙视。

把这行去掉,变成using namespace std了。

接下来还是满屏的错误。有必要贴出来:
/usr/include/g++-3/stl_hashtable.h: In method `size_t hashtable<_Val,
_Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num_key (const
_Key &, unsigned int) const [with _Val = pair,
_Key = string, _HashFcn = hash, _ExtractKey =
_Select1st >, _EqualKey = equal_to,
_Alloc = allocator]':
/usr/include/g++-3/stl_hashtable.h:536:   instantiated from `hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num (const _Val &, unsigned int) const [with _Val = pair, _Key = string, _HashFcn = hash, _ExtractKey = _Select1st >, _EqualKey = equal_to, _Alloc = allocator]'
/usr/include/g++-3/stl_hashtable.h:930:   instantiated from `hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::resize (unsigned int) [with _Val = pair, _Key = string, _HashFcn = hash, _ExtractKey = _Select1st >, _EqualKey = equal_to, _Alloc = allocator]'
/usr/include/g++-3/stl_hashtable.h:356:   instantiated from `hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::insert_unique (const _Val &) [with _Val = pair, _Key = string, _HashFcn = hash, _ExtractKey = _Select1st >, _EqualKey = equal_to, _Alloc = allocator]'
/usr/include/g++-3/stl_hash_map.h:161:   instantiated from `hash_map<_Key, _Tp, _HashFcn, _EqualKey, _Alloc>::insert (typename hashtable, _Key, _HashFcn, _Select1st >, _EqualKey, _Alloc>::value_type &) [with _Key = string, _Tp = string, _HashFcn = hash, _EqualKey = equal_to, _Alloc = allocator]'
test_hash.cpp:10:   instantiated from here
/usr/include/g++-3/stl_hashtable.h:531: no match for call to `(const
hash) (const basic_string,
__default_alloc_template > &)'

所谓的test_hash.cpp:10:   instantiated from here是这个:
my_map.insert(make_pair((string)("abcd"), (string)("bcdef")));
怎么看怎么没问题。怎么改都是同样的错误。
我疯了。

就在我眼冒火花,牙啃键盘,打算抛弃hash_map,换用公司内的dict的时候,发现了网上一个讲hash_map的帖子。里面有这么一句话:

在SGI STL中,提供了以下hash函数:
struct hash
struct hash
struct hash
struct hash
struct hash
struct hash
struct hash
struct hash
struct hash
struct hash
struct hash

联系到出错信息最后一句,我终于明白为什么了。原来SGI_STL没提供string的hash函数。凸="=凸
补上struct hash,终于可以run起来了。

hash_map的第四个模板参数是equal_to。这个是标准stl提供的……所以幸免于难。

NND,vs2k5提供的STL库什么事情都没,这个垃圾STL库居然忽略了最关键的string hash函数。给他曝光:
/*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
跟C++标准差太多了。狂鄙视。

最后,眼噙泪水的把救我于水火之中的原文的地址贴过来。
关于hash_map的介绍,说的很清楚。
http://www.cnitblog.com/cockerel/archive/2006/06/12/12046.html

 

 

 struct hash
struct hash
struct hash 
struct hash 
struct hash
struct hash
struct hash 
struct hash 
struct hash
struct hash 
struct hash 也就是说,如果你的key使用的是以上类型中的一种,你都可以使用缺省的hash函数。当然你自己也可以定义自己的hash函数。对于自定义变量,你只能如此,例如对于string,就必须自定义hash函数。例如: 
struct str_hash{
        size_t operator()(const string& str) const
        {
                unsigned long __h = 0;
                for (size_t i = 0 ; i < str.size() ; i ++)
                __h = 5*__h + str[i];
                return size_t(__h);
        }
};
//如果你希望利用系统定义的字符串hash函数,你可以这样写:
struct str_hash{
        size_t operator()(const string& str) const
        {
                return return __stl_hash_string(str.c_str());
        }
};在声明自己的哈希函数时要注意以下几点: 
使用struct,然后重载operator(). 
返回是size_t 
参数是你要hash的key的类型。 
函数是const类型的。 
如果这些比较难记,最简单的方法就是照猫画虎,找一个函数改改就是了。

你可能感兴趣的:(算法研究(数据挖掘,机器学习,自然语言,深度学习,搜索引擎))