hash_set和hash_map自定义数据类型的处理

最近做毕业设计,用到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上可以编译通过,没试过,各位可以实践下

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值