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<const string, string>,
_Key = string, _HashFcn = hash<string>, _ExtractKey =
_Select1st<pair<const string, string> >, _EqualKey = equal_to<string>,
_Alloc = allocator<string>]':
/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<const string, string>, _Key = string, _HashFcn = hash<string>, _ExtractKey = _Select1st<pair<const string, string> >, _EqualKey = equal_to<string>, _Alloc = allocator<string>]'
/usr/include/g++-3/stl_hashtable.h:930:   instantiated from `hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::resize (unsigned int) [with _Val = pair<const string, string>, _Key = string, _HashFcn = hash<string>, _ExtractKey = _Select1st<pair<const string, string> >, _EqualKey = equal_to<string>, _Alloc = allocator<string>]'
/usr/include/g++-3/stl_hashtable.h:356:   instantiated from `hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::insert_unique (const _Val &) [with _Val = pair<const string, string>, _Key = string, _HashFcn = hash<string>, _ExtractKey = _Select1st<pair<const string, string> >, _EqualKey = equal_to<string>, _Alloc = allocator<string>]'
/usr/include/g++-3/stl_hash_map.h:161:   instantiated from `hash_map<_Key, _Tp, _HashFcn, _EqualKey, _Alloc>::insert (typename hashtable<pair<const _Key, _Tp>, _Key, _HashFcn, _Select1st<pair<const _Key, _Tp> >, _EqualKey, _Alloc>::value_type &) [with _Key = string, _Tp = string, _HashFcn = hash<string>, _EqualKey = equal_to<string>, _Alloc = allocator<string>]'
test_hash.cpp:10:   instantiated from here
/usr/include/g++-3/stl_hashtable.h:531: no match for call to `(const
hash<string>) (const basic_string<char, string_char_traits<char>,
__default_alloc_template<true, 0> > &)'

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

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

在SGI STL中,提供了以下hash函数:
struct hash<char*>
struct hash<constchar*>
struct hash<char>
struct hash<unsignedchar>
struct hash<signedchar>
struct hash<short>
struct hash<unsignedshort>
struct hash<int>
struct hash<unsignedint>
struct hash<long>
struct hash<unsignedlong>

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

hash_map的第四个模板参数是equal_to<string>。这个是标准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<char*>
struct hash<const char*>
struct hash<char> 
struct hash<unsigned char> 
struct hash<signed char>
struct hash<short>
struct hash<unsigned short> 
struct hash<int> 
struct hash<unsigned int>
struct hash<long> 
struct hash<unsigned long> 也就是说,如果你的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类型的。 
如果这些比较难记,最简单的方法就是照猫画虎,找一个函数改改就是了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值