从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. Mysql事务及行级锁的理解

    在最近的开发中,碰到一个需求签到,每个用户每天只能签到一次,那么怎么去判断某个用户当天是否签到呢?因为当属表设计的时候,每个用户签到一次,即向表中插入一条记录,根据记录的数量和时间来判断用户当天是否签 ...

  2. Linux命令之 文件归档管理

    1.文件相关知识 Linux怎样保存文件 数据 -这里数据就是文件的内容 元数据 -在linux系统中,所有与某个文件相关的额外信息都保存在一个叫做i-节点(inode)的节构中 文件名 -文件名保存 ...

  3. 苹果手机button有色差

    input[type=button], input[type=submit], input[type=file], button { cursor: pointer; -webkit-appearan ...

  4. WCF代理是怎么工作的?用代码说话

    1.WCF生成代理的方式 2.WCF代理原理 第一个问题引用 一篇Robin's博文[WCF生成客户端对象方式解析] 讲述了创建客户端服务对象的方法 1.代理构造法 a.开启服务后,添加服务引用 b. ...

  5. js设置元素的onclick传参方法

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  6. Android学习手记(6) TabActivity和TabHost

    使用TabHost可以实现标签式效果,将两个Activity放在两个Tab内. 首先,需要基于MainActivity创建一个TabHost对象. TabHost tabHost = this.get ...

  7. java之NIO编程

    所谓行文如编程,随笔好比java文件,文章好比类,参考文献是import,那么目录就是方法定义. 本篇文章处在分析thrift的nonblocking server之前,因为后者要依赖该篇文章的知识. ...

  8. iOS 网络与多线程--2.同步Get方式的网络请求(阻塞)

    通过Get请求方式同步获取网络数据.一旦发送同步请求,程序将停止用户交互,直至服务器返回数据. 之后在视图控制器文件(ViewController.m)内添加以下代码 在viewDidLoad函数内添 ...

  9. JavaScript不一样的语法

    JavaScript除了面向对象的部分,基本语法和C语言类似,但是也有一些自己的特别之处,现总结如下: (1)break和continue后面可以跟label 语法: break labelname; ...

  10. 文件磁盘读写类CArchive类

    CArchive类的成员 数据成员 m_pDocument 指向被串行化的CDocument对象 构造函数 Carchive 创建一个Carhcive对象 Abort在不异常的情况下,关闭归档文件 C ...