最近做毕业设计,用到hash_set和hash_map, 在VS2005下开发,处理自定义数据时,出现一大堆错误,花了将近一天才弄清楚,下面介绍:
hash_set和hash_map的数据结构定义差不多,能够处理基本数据类型,对于字符串和其他自定义数据如结构体、类等,则需要自行定义hash计算函数和hash比较函数,下面讨论处理字符串string( char *同)情况
1、首先SGI内部已经包含了能够对字符串的hash_value计算,但没有定义hash_compare函数,因此需定义:
如:VS2005
struct ENTRY(hash_map中做value)
{
int TFi; //
int A, B, C, D;
};
struct wstr_hash_compare: public hash_compare<wstring>
{
public:
//重写字符串的hash_value计算,由于容器内部已经实现了字符串的hash函数, 因此此函数可有可无
inline size_t operator()( const wstring &s)const {
unsigned long _h = 0;
for(size_t i= 0; i<s.size(); i++)
_h = 31*_h + s[i];
return size_t(_h);
}
//重写,必须有,否则使用find()函数时,将无法找到该值
bool operator()( const wstring &s1, const wstring &s2 )const //定义比较函数
{
return comp (s1, s2); //return s1<s2;
}
};
typedef hash_set<wstring, wstr_hash_compare> HDic; //HDic为词典结构
typedef hash_map<wstring, ENTRY,wstr_hash_compare >HEntryW;
int main()
{
HDic h_set; //顶一个set容器
HEntryW h_map; //定义一个map容器
ENTRY entrys[2] ={ {0,1,2,3} , {4,5,6,7};
h_set.insert( L"张三");
h_set.insert( L"李四");
h_map[L"张三"] = entrys[0];
h_map[]...................
return 0;
}
注意:msdn上面的自定义数据类型时没有将hash_value计算和hash_compare集合在一个struct或class中,如下
struct wstr_hash{
public:
//字符串的hash_value计算,由于容器内部已经实现了字符串的hash函数, 因此此函数可有可无
inline size_t operator()( const wstring &s)const {
unsigned long _h = 0;
for(size_t i= 0; i<s.size(); i++)
_h = 31*_h + s[i];
return size_t(_h);
}
}
//分开
struct wstr_equal{
bool operator()( const wstring &s1, const wstring &s2 )const //定义比较函数
{
return s1<s2;
}
};
typedef hash_set<wstring, wstr_hash> HDic; //HDic为词典结构
typedef hash_map<wstring, ENTRY,wstr_hash, wstr_equal>HEntryW;
int main()
{
HDic h_set; //编译无法通过
HEntryW h_map; //编译无法通过
............................
}
这是很多版本上的写法,貌似linux上可以编译通过,没试过,各位可以实践下