• Bitset<>用于unordered container时的默认hash函数


    自从c++11起,bitset用于unordered container,将会提供默认的hash函数。

    在gcc中,相关代码如下:

    01495   // DR 1182.
    01496   /// std::hash specialization for bitset.
    01497   template<size_t _Nb>
    01498     struct hash<_GLIBCXX_STD_D::bitset<_Nb>>
    01499     : public std::unary_function<_GLIBCXX_STD_D::bitset<_Nb>, size_t>
    01500     {
    01501       size_t
    01502       operator()(const _GLIBCXX_STD_D::bitset<_Nb>& __b) const
    01503       {
    01504     const size_t __clength = (_Nb + __CHAR_BIT__ - 1) / __CHAR_BIT__;
    01505     return std::_Fnv_hash::hash(__b._M_getdata(), __clength);
    01506       }
    01507     };
    01508 
    01509   template<>
    01510     struct hash<_GLIBCXX_STD_D::bitset<0>>
    01511     : public std::unary_function<_GLIBCXX_STD_D::bitset<0>, size_t>
    01512     {
    01513       size_t
    01514       operator()(const _GLIBCXX_STD_D::bitset<0>&) const
    01515       { return 0; }
    01516     };

    在vs2015中,相关代码如下:

    // TEMPLATE STRUCT SPECIALIZATION hash
    template<size_t _Bits>
        struct hash<bitset<_Bits> >
        {    // hash functor for bitset<_Bits>
        typedef bitset<_Bits> argument_type;
        typedef size_t result_type;
    
        size_t operator()(const argument_type& _Keyval) const
            {    // hash _Keyval to size_t value by pseudorandomizing transform
            return (_Keyval.hash());
            }
        };

    我自己也写了一小段程序来试验bitset在unordered container中的用法:

    #include <bitset>
    #include <unordered_set>
    #include <iostream>
    #include "print.hpp"
    using namespace std;
    
    int main()
    {
        bitset<3> bitset00(0);
        bitset<3> bitset01(1);
        bitset<3> bitset02(2);
        bitset<3> bitset03(3);
        bitset<3> bitset04(4);
        bitset<3> bitset05(5);
        bitset<3> bitset06(6);
        bitset<3> bitset07(7);
        
        unordered_set<bitset<3>> coll = {bitset00, bitset01, bitset02, bitset03, bitset04, bitset05, bitset06, bitset07 };
        PRINT_ELEMENTS(coll);
        return 0;
    }

    注:其中print.hpp借用的是Nicolai M. Josuttis的The C++ Standard Library中的代码。

    其输出如下:

    000 001 010 011 100 101 110 111
  • 相关阅读:
    jquery 动态选中radio
    在Struts2的Action中取得请求参数值的几种方法
    Collections类sort方法的用法
    struts2 action 之间跳转
    JavaScript 解析 xml 文件 如 rss订阅
    jquery 获取 选中的checkbox的值
    velocity 时间显示 时间格式化 时间转化
    firefox3.6 ie8 jQuery选择checkbox
    IFormattedTextSymbol接口 设定Anchor点的水平或者垂直对其方式
    gisbase网站,因其购买的空间提供商,“涉黄”暂行关闭。
  • 原文地址:https://www.cnblogs.com/ptolemaeus/p/BitSet_UnorderedContainer_HashFunc.html
Copyright © 2020-2023  润新知