• STL hash function的模板特化


    哈希函数的作用是将一个值映射为一个哈希值,从而根据这个哈希值,在哈希表中对数据进行定位。

    template <class _Val, class _Key, class _HashFcn,
              class _ExtractKey, class _EqualKey, class _Alloc = alloc>
    class hashtable;
    

    STL中定义的hashtable容器包含哈希函数模板参数_HashFcn。_HashFcn既然是一个类类型,又能提供函数的功能,因此是一种仿函数(functor);
    仿函数是一个类,在类中重载()运算符,从而由仿函数类对象即可实现函数功能。
    在SGI-STL中的stl_hash_fun.h中定义了若干仿函数类:

    #ifndef __SGI_STL_HASH_FUN_H
    #define __SGI_STL_HASH_FUN_H
    
    #include <stddef.h>
    
    __STL_BEGIN_NAMESPACE
    
    template <class _Key> struct hash { };
    
    inline size_t __stl_hash_string(const char* __s)
    {
      unsigned long __h = 0; 
      for ( ; *__s; ++__s)
        __h = 5*__h + *__s;
      
      return size_t(__h);
    }
    
    __STL_TEMPLATE_NULL struct hash<char*>
    {
      size_t operator()(const char* __s) const { return __stl_hash_string(__s); }
    };
    
    __STL_TEMPLATE_NULL struct hash<const char*>
    {
      size_t operator()(const char* __s) const { return __stl_hash_string(__s); }
    };
    
    __STL_TEMPLATE_NULL struct hash<char> {
      size_t operator()(char __x) const { return __x; }
    };
    __STL_TEMPLATE_NULL struct hash<unsigned char> {
      size_t operator()(unsigned char __x) const { return __x; }
    };
    __STL_TEMPLATE_NULL struct hash<signed char> {
      size_t operator()(unsigned char __x) const { return __x; }
    };
    __STL_TEMPLATE_NULL struct hash<short> {
      size_t operator()(short __x) const { return __x; }
    };
    __STL_TEMPLATE_NULL struct hash<unsigned short> {
      size_t operator()(unsigned short __x) const { return __x; }
    };
    __STL_TEMPLATE_NULL struct hash<int> {
      size_t operator()(int __x) const { return __x; }
    };
    __STL_TEMPLATE_NULL struct hash<unsigned int> {
      size_t operator()(unsigned int __x) const { return __x; }
    };
    __STL_TEMPLATE_NULL struct hash<long> {
      size_t operator()(long __x) const { return __x; }
    };
    __STL_TEMPLATE_NULL struct hash<unsigned long> {
      size_t operator()(unsigned long __x) const { return __x; }
    };
    
    __STL_END_NAMESPACE
    
    #endif /* __SGI_STL_HASH_FUN_H */
    

    以上代码中先定义了一个空的类:

    template <class _Key> struct hash { };
    

    __stl_hash_string函数产生字符相关类型的哈希值。

    inline size_t __stl_hash_string(const char* __s)
    {
      unsigned long __h = 0; 
      for ( ; *__s; ++__s)
        __h = 5*__h + *__s;
      
      return size_t(__h);
    }
    

     __STL_TEMPLATE_NULL宏通过定义为template<>。其后接模板类定义,表示模板的特化版本,尖括号中的类型T表示模板特化类针对T类型的模板参数的特殊处理。
     列出的模板特化类主要针对某些POD(Plain old Data)类型。对于字符相关类型,会调用__stl_hash_string函数产生哈希值。对其他几种特化类型,则直接返回其值。
     空的类并不是什么都不做,在这个头文件中,它也起到了至关重要的作用。由于hash类的非特化版本的类定义是空的,当传入任何非特化模板类型参数,都会对应于非特化版本的模板类中。而在非特化版本的hash中,并未重载operator(),因此对此类型的对象调用()运算符进行比较时,会报告未定义错误,从而限制hashtable容器只能对特化类型进行hash。这也正是空的hash类的作用。

  • 相关阅读:
    面向对象基础
    VmWare下安装CentOS6图文安装教程
    设计模式培训之一:为什么要用单例模式?
    CentOS5.4下安装和配置Apache、PHP、MySql、PHPMyAdmin
    WEB架构师成长系列索引
    WEB架构师成长之路之三架构师都要懂哪些知识
    设计模式培训之三:抽象工厂
    IOS6屏幕自动旋转设置测试
    设计模式培训之二:简单工厂、工厂方法
    QT和Oracle连接的oci驱动的编译
  • 原文地址:https://www.cnblogs.com/SupremeGIS-Developer/p/11931453.html
Copyright © 2020-2023  润新知