从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. Spring事务管理使用

    发现问题 最近,碰到一个问题,再用spring实现事务管理的时候,发现不起作用,在出异常时,并不会回滚数据库操作. 我想实现的功能如下: @Transactional(isolation=Isolat ...

  2. Android SwitchButton(滑动开关)

    @RemoteView public class Button extends TextView { public Button(Context context) { this(context, nu ...

  3. 奇妙的go语言(网页下载)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 眼下,网上关于网页爬行的代码非常多.可是,自从看了go语言的web下载代码之后,我才发现原来它 ...

  4. SQL 结构化查询语言手册

    摘自该学习网站: http://www.w3school.com.cn/sql/ 新学到的几点: and 和or 连用,记得用括号.                2.SQL通配符补充   例如:   ...

  5. Java学习之路(一)了解Java

    Java“白皮书”的关键术语 1)简单性 相对于C++:没有头文件.指针运算.结构.联合.操作符重载.虚基类. 另一方面是小:java微型版(Java Micro Edition)用于嵌入式设备 2) ...

  6. ASP.NET-FineUI开发实践-4(二)

    在网上找了找,实验了一下window弹出和关闭的动画效果分享一下. 接上次的代码 default.js window_tips.animCollapse= true;//打开动画效果 window_t ...

  7. js三种消息框总结-警告框、确认框、提示框

    js消息框类别:警告框.确认框.提示框 警告框:alert("文本"); 确认框:confirm("文本"); 提示框:prompt("文本" ...

  8. nyoj 36

    //这一题是  nyoj 36  是一道求最长公共子序列的题,也是用dp做出来的 核心代码也就是一句,题目大概思路是先找到两组字符串里面相同的字母 在二维数组里面更新每次比较过后dp的值,空想很难理解 ...

  9. 关于Aspose对于Word操作的一些扩展及思考

    Aspose.word Aspose.Words是一款先进的类库,通过它可以直接在各个应用程序中执行各种文档处理任务.Aspose.Words支持DOC,OOXML,RTF,HTML,OpenDocu ...

  10. JS函数定义与匿名函数的调用

    一.函数声明.函数表达式.匿名函数 函数声明:function fnName () {…};使用function关键字 声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName ...