在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
_Select1st
_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
/usr/include/g++-3/stl_hashtable.h:930: instantiated from `hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::resize (unsigned int) [with _Val = pair
/usr/include/g++-3/stl_hashtable.h:356: instantiated from `hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::insert_unique (const _Val &) [with _Val = pair
/usr/include/g++-3/stl_hash_map.h:161: instantiated from `hash_map<_Key, _Tp, _HashFcn, _EqualKey, _Alloc>::insert (typename hashtable
test_hash.cpp:10: instantiated from here
/usr/include/g++-3/stl_hashtable.h:531: no match for call to `(const
hash
__default_alloc_template
所谓的test_hash.cpp:10: instantiated from here是这个:
my_map.insert(make_pair
怎么看怎么没问题。怎么改都是同样的错误。
我疯了。
就在我眼冒火花,牙啃键盘,打算抛弃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
hash_map的第四个模板参数是equal_to
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
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类型的。
如果这些比较难记,最简单的方法就是照猫画虎,找一个函数改改就是了。