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

来源:互联网 发布:flv下载软件硕鼠 编辑:程序博客网 时间:2024/06/05 23:39

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

 

 

 

 

 

 

原创粉丝点击