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
时间: 2024-11-17 12:24:05

Bitset<>用于unordered container时的默认hash函数的相关文章

STL学习笔记— —无序容器(Unordered Container)

简单介绍 在头文件<unordered_set>和<unordered_map> 中定义 namespace std { template <typename T, typename Hash = hash<T>, typename EqPred = equal_to<T>, typename Allocator = allocator<T> > class unordered_set; template <typename T

GEEK学习笔记— —STL容器之无序容器(Unordered Container)

简介 在头文件<unordered_set>和<unordered_Unord> 中定义 namespace std { template <typename T, typename Hash = hash<T>, typename EqPred = equal_to<T>, typename Allocator = allocator<T> > class unordered_set; template <typename T

在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi

可使用以下代码: //Create our own namespaces for the output XmlSerializerNamespaces ns = new XmlSerializerNamespaces (); //Add an empty namespace and empty value ns.Add ("", ""); //Create the serializer XmlSerializer slz = new XmlSerializer (s

JS 省市区级联 修改地址操作时的默认选中方法

省市区级联JS控件 下载地址http://files.cnblogs.com/bin-pureLife/%E5%B0%8F%E5%9B%BE%E6%A0%87.zip function update(province,city,county){ $("#s_province option").each(function(){ if($(this).val()==province){ $(this).attr('selected',true) change(1); } }); $(&qu

python 在调用时计算默认值

大家都知道python的默认值是在函数定义时计算出来的, 也就是说默认值只会计算一次, 之后函数调用时, 如果参数没有给出,同一个值会赋值给变量, 这会导致, 如果我们想要一个list默认值, 新手通常这么写: def foo(a=[]): a.append(3) print a 其实是错误的,两次调用会这样的结果: [3] [3, 3] 其实应该这么写 def baz(a=None): a = a or [] a.append(3) print a 两次调用输出以下结果: [3] [3] 这样

在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连

sql server服务器sqlserver远程连接数据库防火墙在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连 在建立与服务器的连接时出错.在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导 致此失败. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) 为什么.我已经在SQL的外围配置设置中把他的

Java 中的 int 与 Integer 用于 List&lt;Integer&gt; 时,以及通过打印变量检测程序运行和函数调用次数计数

总结一下最近做的东西中遇到的问题 1. Java 中的 int 与 Integer 用于 List<Integer>  时 两者之间的关系都是很清楚的,int 是基本数据类型,存储的是值,而 Integer 是引用数据类型,存储的是指向数值的地址. Integer 是在类层面上对 int 的封装.然后 Java 提供了自动装包拆包机制,使得两者之间可以转换.这里主要是测试了下它们用于 List 时候的疑惑. /* * To change this template, choose Tools

[办公应用]如何设置IE打印时的默认页边距,并设置纸张为横向(会计票据打印)

最近一个做会计的同事询问,如何将IE打印时的默认页边距更改,并且每次都要是横向的纸张. 这是因为她已经测试好纸张的大小,并据此调整好了页边距.可惜的是下一次打印时,又要重新调整一遍. 经过研究,方法如下(应该适用于各个版本的IE): 第一步:注册表修改(如果你不会,请你找朋友修改),找到如下位置 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PageSetup 看到margin开头的上下左右的地方既可以修改.(\margin_rig

confirm的用法 一般用于按钮操作时确定是否执行

<script type = "text/javascript" language = "javascript"> function clear1() { if(confirm("确定要清空数据吗?")) { document.main.text1.value = ""; } } </script> <body> <form name="main"> <