从2011年开始,C++支持非排序的unordered_map和unordered_set(原先的map和set都是通过有序结构实现的)

下面是一些性能上的测试

#include<iostream>
#include<ctime>
#include<map>
#include<set>
#include<cstdlib>
#include<unordered_map>
#include<unordered_set>
#include<string>
using namespace std;
int main(){
int n=100000;
vector<string> vec;
srand(unsigned(time(0)));
for(int i=0;i<n;i++){
string s;
for(int j=0;j<30;j++){
s+='a'+rand()%26;
}
vec.push_back(s);
}
clock_t start,end;
set<string> tm;
unordered_set<string>hm;
start=clock();
for(int i=0;i<n;i++){
hm.insert(vec[i]);
}
end=clock();
cout<<"unordered_set:"<<end-start<<endl;
start=clock();
for(int i=0;i<n;i++){
tm.insert(vec[i]);
}
end=clock();
cout<<"set:"<<end-start<<endl;
start=clock();
for(int i=0;i<100000;i++){
if(hm.find(vec[i])!=hm.end()){}
}
end=clock();
cout<<"unordered_set:"<<end-start<<endl;
start=clock();
for(int i=0;i<100000;i++){
if(tm.find(vec[i])!=tm.end()){}
}
end=clock();
cout<<"set:"<<end-start<<endl;
return 0;
}

unordered_set:7417
set:1228
unordered_set:511
set:1050

#include<iostream>
#include<ctime>
#include<map>
#include<set>
#include<cstdlib>
#include<unordered_map>
#include<unordered_set>
#include<string>
using namespace std;
int main(){
int n=100000;
vector<string> vec;
srand(unsigned(time(0)));
for(int i=0;i<n;i++){
string s;
for(int j=0;j<30;j++){
s+='a'+rand()%26;
}
vec.push_back(s);
}
clock_t start,end;
map<string,bool> tm;
unordered_map<string,bool>hm;
start=clock();
for(int i=0;i<n;i++){
hm[vec[i]]=true;
}
end=clock();
cout<<"unordered_map:"<<end-start<<endl;
start=clock();
for(int i=0;i<n;i++){
tm[vec[i]]=true;
}
end=clock();
cout<<"map:"<<end-start<<endl;
start=clock();
for(int i=0;i<100000;i++){
if(hm[vec[i]]){}
}
end=clock();
cout<<"unordered_map:"<<end-start<<endl;
start=clock();
for(int i=0;i<100000;i++){
if(tm[vec[i]]){}
}
end=clock();
cout<<"map:"<<end-start<<endl;
return 0;
}

unordered_map:7894
map:1722
unordered_map:497
map:959

对自定类型使用hash表

class Pair{
  public:
  int a;
  int b;
  Pair(){}
  Pair(int a1,int b1){
    a=a1;
    b=b1;
  }
  bool operator==(const Pair& p)const{
return a==p.a&&b==p.b;
  }
};
struct Hash_Pair
{
  size_t operator()(const Pair &p) const
  {
    double temp=p.a;
    temp+=p.b*2147483647.0;
    hash<double> ht;//直接用了已经提供的hah函数,没有自己编写hash
    return ht(temp);
  }
};
struct Equal_Pair
{
  bool operator()(const Pair &left, const Pair &right) const
  {
    return left.a==right.a&&left.b==right.b;
  }
};
unordered_set<Pair,Hash_Pair,Equal_Pair> set;

C++ 哈希表的更多相关文章

  1. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  2. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  3. ELF Format 笔记(十五)—— 符号哈希表

    ilocker:关注 Android 安全(新手) QQ: 2597294287 符号哈希表用于支援符号表的访问,能够提高符号搜索速度. 下表用于解释该哈希表的组织,但该格式并不属于 ELF 规范. ...

  4. Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...

  5. 什么叫哈希表(Hash Table)

    散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. - 数据结构 ...

  6. 【哈希表】CodeVs1230元素查找

    一.写在前面 哈希表(Hash Table),又称散列表,是一种可以快速处理插入和查询操作的数据结构.哈希表体现着函数映射的思想,它将数据与其存储位置通过某种函数联系起来,其在查询时的高效性也体现在这 ...

  7. openssl lhash 数据结构哈希表

    哈希表是一种数据结构,通过在记录的存储位置和它的关键字之间建立确定的对应关系,来快速查询表中的数据: openssl lhash.h 为我们提供了哈希表OPENSSL_LHASH 的相关接口,我们可以 ...

  8. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  9. python数据结构与算法——哈希表

    哈希表 学习笔记 参考翻译自:<复杂性思考> 及对应的online版本:http://greenteapress.com/complexity/html/thinkcomplexity00 ...

  10. [转]:Delphi 中的哈希表(1): THashedStringList

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

随机推荐

  1. Linux下用rpm方式安装MySQL

    1.MySQL下载地址. www.mysql.com/downloads/mysql-4.0.html 下载MySQL 5.1版本的2个包(根据你的实际需求下载所需要的包): MySQL-server ...

  2. 《fullPage.js》创建全屏滚动的网站

    插件介绍 fullPage.js是一个简单易用的插件,创建全屏滚动的网站(也被称为单页网站).它允许全屏滚动创建网站,以及添加内部滑块. 浏览器兼容性 主要功能 支持鼠标滚动 支持前进后退和键盘控制 ...

  3. 网页JavaScript4

    表单验证:一.非空验证:1.内容是不是空的.判断值的长度是不是0.length属性.压缩空格的函数. 2.内容是不是改变了. 二.对比验证:1.验证两个控件值的关系(相同,大小) 2.验证控件的值与某 ...

  4. 网络断开后重连downloadProvider继续下载问题调试分析

    最近在安卓4.4上遇到一个断开wifi后重新连接wifi, downloadProvider继续下载文件失败的问题.于是开始了解下载管理模块的断点续载功能:     1.首先,分析android lo ...

  5. PHP XML Parser

    安装 XML Parser 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP XML Parser 函数 PHP:指示支持该函数的最早的 PHP 版本. 函数 描述 PHP utf8 ...

  6. 武汉科技大学ACM :1005: A+B for Input-Output Practice (V)

    Problem Description Your task is to calculate the sum of some integers. Input Input contains an inte ...

  7. java——JNI(例子控制台(64位)清屏

    因为java的最底层是jvm,所以单纯的控制台java程序不能感知jvm再下面的操作系统的情况, 可以通过JNI(Java Native Interface)技术实现java后台调用C++/C的dll ...

  8. 1、CentOS6.5系统安装及学习

    1.   CentOS6.5系统安装及学习 1.需要的工具,Vmware workstation12虚拟机,CentOS6.5 ISO镜像,选择的是32位系统. 2.下载CentOS6.5地址:htt ...

  9. Mysql学习基础语法

    -- Mysql 数 据 库 语 法 创建数据库 create database 数据库名; 创建表 ) ); 复制表和数据 create table 复制后新的表名 select * from 旧表 ...

  10. Delphi XE7 开发ActiveX 及在IntraWeb下调试

    最近学习DelphiXE7下Intraweb开发,Intraweb完全服务器端运行使得FastReport报表系统无法在客户端运行,当然网上也有一大堆解决方案,例如导出到PDF后,给出连接,让客户点击 ...