zoukankan      html  css  js  c++  java
  • Visual Studio中的hash_map

    hash_map的声明如下:

    template <
       class Key, 
       class Type, 
       class Traits=hash_compare<Key, less<Key> >, 
       class Allocator=allocator<pair <const Key, Type> > 
    >
    class hash_map

    第四个参数表示map中元素存储的方式,一般情况下,我们都使用pair类型,所以第四个参数使用默认的就可以了。

    第三个参数是一个仿函数类,提供两个函数,第一个计算hash,第二个比较key的大小,故要求key支持operator<:

    //计算hash值
    size_t operator()(const _Kty& _Keyval) const
    //比较两个大小
    bool operator()(const _Kty& _Keyval1, const _Kty& _Keyval2) const

    如果key是int double等基本类型,可以使用默认参数,注意,对string这样的类类型也可以使用这个默认参数(因为1.hash_compare提供了计算string的hash的函数。2.string有<操作符,所以hash_compare可以提供hash和compare的功能)。

    hash_map< string, vector<string> > a;

    不过,曾经VC(如VC7)是不能这样的,当时,VC STL的作者给了个回答以及解决办法,如下:

    The   V7   version   of   hash_map   has   no   default   hash   function   for   strings. 
    We 've   already   fixed   this   oversight   --   it   will   appear   in   a   future 
    VC++   release.   For   now,   you   can   add   your   own   comparator   along   the 
    lines   shown   below: 

    struct   mycomp 
      {   //   define   hash   function   for   strings 
      enum 
        {   //   parameters   for   hash   table 
        bucket_size   =   4,   //   0   <   bucket_size 
        min_buckets   =   8};   //   min_buckets   =   2   ^^   N,   0   <   N 
    
      size_t   operator()(const   string&   s1)   const 
        {   //   hash   string   s1   to   size_t   value 
        const   unsigned   char   *p   =   (const   unsigned   char   *)s1.c_str(); 
        size_t   hashval   =   0; 
    
        for   (size_t   n   =   s1.size();   0   <   n;   --n) 
          hashval   +=   *p++;   //   or   whatever 
        return   (hashval); 
        } 
    
      bool   operator()(const   string   &s1,   const   string   &s2)   const 
        {   //   test   if   s1   ordered   before   s2 
        return   (s1   <   s2); 
        } 
      }; 

    To use it:

    hash_map <string,   int,   mycomp>   mymap; 

    HTH, 

    P.J.   Plauger 
    Dinkumware,   Ltd. 

    如果key是自定义的类,就需要像上面那样自己写个仿函数类作为第三个参数了,同时自定义的类应该支持operator<。

     

    参考文献:http://www.cppblog.com/guojingjia2006/archive/2008/01/12/41037.aspx

  • 相关阅读:
    Hibernate Annotation 生成数据库表(UUId)
    Hibernate用注解生成表
    Java语言 链接Oracle数据库
    Oracle 启动监听命令
    java.lang.IllegalArgumentException异常 数据库别名问题
    java.lang.IllegalArgumentException异常 返回值类型的问题
    java.lang.IllegalArgumentException异常 配置文件的问题
    JUnit 异常处理
    DIV水平垂直布局
    Java 链接SQL Server 数据库
  • 原文地址:https://www.cnblogs.com/xiongjiaji/p/2693831.html
Copyright © 2011-2022 走看看