自从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

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

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

    简单介绍 在头文件<unordered_set>和<unordered_map> 中定义 namespace std { template <typename T, ty ...

  2. cmder设置打开时的默认目录

    cmder设置打开时的默认目录 打开cmder自动进入工作目录,怎么配置? http://superuser.com/questions/1005285/run-a-bat-file-with-cmd ...

  3. input 默认值为灰色,输入时清楚默认值

    input 默认值为灰色,输入时清楚默认值 <input value="please input your name" onFocus="if(value==def ...

  4. magento -- 添加新产品时状态默认为激活,库存状态默认为有库存

    添加新产品时状态默认为激活 打开文件/app/code/core/Mage/Catalog/Model/Product/Status.php,注释掉“Please Select” /** * Retr ...

  5. [ActionScript 3.0] AS3 用于拖动对象时跟随鼠标的缓动效果

    package com.fylibs.components.effects { import flash.display.DisplayObject; import flash.events.Even ...

  6. 其他函数:值为NULL时的默认值NVL,DECODE

    NVL(列,默认数字值),此函数返回值为数值型,非NULL时返回原始值,NULL时返回默认数字值. DECODE:

  7. [笔试题目]使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍?

    [笔试题目] 使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍? StringBuffer 底层是依赖了一个字符数组才能存储字符 ...

  8. Android开发,在Activity启动时,默认隐藏软键盘。和遮挡Edittext时的处理

    在Activity启动时,默认隐藏软键盘: 在AndroidManifest.xml中找到你得Activity ,为它添加属性: android:windowSoftInputMode="s ...

  9. JS检查当图片不存在时显示默认图片和键盘大小写键状态

    当图片不存在时显示默认图片 <script type="text/javascript"> var imgs = document.images; for(var i ...

随机推荐

  1. scikit-learn 朴素贝叶斯类库使用小结

    之前在朴素贝叶斯算法原理小结这篇文章中,对朴素贝叶斯分类算法的原理做了一个总结.这里我们就从实战的角度来看朴素贝叶斯类库.重点讲述scikit-learn 朴素贝叶斯类库的使用要点和参数选择. 1. ...

  2. react+redux教程(四)undo、devtools、router

    上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...

  3. 【TortoiseSVN使用教程】

    TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository        首 先要Checkout服务器端的Repository,所谓的Ch ...

  4. myWaterfall - jQuery瀑布流布局插件

    myWaterfall - jQuery瀑布流布局插件 Demo http://jsfiddle.net/q3011893/p5k2ogy8/embedded/result,html,css,js/ ...

  5. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析

    Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...

  6. BizTalk动手实验(十七)ODBC适配器使用

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 1 课程简介 通过本课程熟悉ODBC适配器的的使用,本练习采用BizTalk 20 ...

  7. 介绍一种基于gulp对seajs的模块做合并压缩的方式

    之前的项目一直采用grunt来构建,然后用requirejs做模块化,requirejs官方有提供grunt的插件来做压缩合并.现在的项目切到了gulp,模块化用起了seajs,自然而然地也想到了模块 ...

  8. ASP.NET MVC使用Areas后怎样获取Area(区域)的名称

    写此随笔,目的只为今后在ASP.NET MVC项目中再用到Area(区域)时作为备查. 获取当前Area(区域)名称的方法是: ViewContext.RouteData.DataTokens[&qu ...

  9. 执行后台任务的利器——Hangfire

    今年1月31日,在微软的MVP 2015社区大讲堂上,我给大家分享了一个演讲:在ASP.NET应用中执行后台任务.其中介绍了三种技术的应用:QueueBackgroundWorkItem.Hangfi ...

  10. jquery css属性练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...