从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. [Redux] Store Methods: getState(), dispatch(), and subscribe()

    console.clear(); const counter = (state = 0, action) => { switch (action.type) { case 'INCREMENT' ...

  2. Cross-origin resource sharing--reference

    Cross-origin resource sharing (CORS) is a mechanism that allows many resources (e.g., fonts, JavaScr ...

  3. uploadify上传大文件时出现404错误

    出现这个错误的话一般是IIs限制了文件大小.IIS7下的默认设置限制了上传大小.这个时候Web.Config中的大小设置也就失效了.具体步骤:1.打开IIS管理器,找到Default Web Site ...

  4. mysql数据库安装方法

    前言 MySQL 有三种安装方式:RPM安装.二进制包安装.源码包安装.这3种种方式各有特色,主要特点参考下表.实际应用中,可以根据你所用的主机环境进行优化,选择 最佳的配置值,安装定制更灵活.访问M ...

  5. SVN Git 设置忽略目录 大全

    eclipse中SVN设置 用svn控制版本,svn本身是不会识别哪些该传,哪些不该传,这就导致有些关于路径的东西(比如拓展jar的路径)也被上传了,而当别人下载后,那个路径对于这个人可能完全不存在, ...

  6. jdbc02

    分层实现新闻管理系统 1.创建新闻信息实体类,jdbc配置文件以及工具类 public class News { // 新闻信息的实体类 private Integer id; //编号 privat ...

  7. web03--session

    1.创建session1.jsp <body> <form action="session2.jsp" method="post"> & ...

  8. 您为这个网络适配器输入的IP地址xxx.xxx.xxx.xx已经分配给另一个适配器xxx...

    您为这个网络适配器输入的IP地址xxx.xxx.xxx.xx已经分配给另一个适配器‘xxx NIC’.... 2008年11月03日 星期一 08:51 问题现象:   在网卡的TCP/IP属性中无法 ...

  9. VC Windows系统服务创建代码

    Windows系统服务创建步骤,常用类封装,废话不多说,直接上代码 // ServceDemo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  10. 【转】深入理解Java内存模型(一)——基础

    并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信 ...