在C++11以上的开发环境中,请直接把map替换成unordered_map,不要使用hash_map

之前我们专门有一篇介绍哈希表,多维哈希表的博文,当时就是以map举例子,然后说了一句把map替换成hash_map就好了

但是事实并非如此,在使用hash_map的时候还需要遵循两个规范

其一就是引用头文件和命名空间的时候要注意,并且这种hash_map只能在GNU C++下使用

其二就是对于自定义类型必须手写一个hash函数,就连string也不例外,而且在必要时提供“==”运算符的重载

这里以Luogu3370的字符串哈希例题来说明一下用法

 #include<ext/hash_map>
#include<string>
#include<cstdio>
#include<iostream>
using namespace std;
using namespace __gnu_cxx;
const int maxn=;
int n;
struct str_hash
{
size_t operator()(const string &str) const
{
return __stl_hash_string(str.c_str());
}
};
/*
struct str_hash
{
size_t operator()(const string& str) const
{
unsigned long __h = 0;
for (size_t i = 0 ; i < str.size() ; i ++)
__h = 5*__h + str[i];
return size_t(__h);
}
};
*/
struct str_euqal
{
bool operator()(const string &s1,const string &s2) const
{
return s1==s2;
}
};
hash_map<string,int,str_hash,str_euqal> mp;
int main()
{
string str;
scanf("%d",&n);
while(n--)
{
cin>>str;
mp[str]++;
}
cout<<mp.size()<<endl;
return ;
}

如果你觉得C++的string太慢了不爽,可以用C语言的形式

struct compare_str
{
bool operator()(const char* p1, const char*p2) const
{
return strcmp(p1,p2)==;
}
};
hash_map<const char*, string, hash<const char*>, compare_str> StrIntMap;

我们注意到second那一维度无所谓,只需要处理键那一位,也就是first那一维就好了

数据结构:hash_map的更多相关文章

  1. hash_map的简洁实现

    hash_map的简洁实现   hash_map是经常被使用的一种数据结构,而其实现方式也是多种多样.如果要求我们使用尽可能简单的方式实现hash_map,具体该如何做呢? 我们知道hash_map最 ...

  2. map vs hash_map

    1. map, multimap, set, multiset g++ 中 map, multimap, set, multiset 由红黑树实现 map: bits/stl_map.h multim ...

  3. STL底层数据结构实现

    C++ STL 的实现: 1.vector      底层数据结构为数组 ,支持快速随机访问 2.list            底层数据结构为双向链表,支持快速增删 3.deque       底层 ...

  4. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

  5. C++ 基本数据结构整理

    Hash Map (Unordered_map) Insert #include <unordered_map> using namespace std; unordered_map &l ...

  6. hash_map和map的区别

    hash_map和map的区别 分类: STL2008-10-15 21:24 5444人阅读 评论(0) 收藏 举报 class数据结构编译器存储平台tree 这里列几个常见问题,应该对你理解和使用 ...

  7. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  8. STL的使用和背后数据结构

    STL(Standard Template Library即,模板库)包括六个部分:容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adapter ...

  9. c++ hash_map/unordered_map 使用

    C++中有很多中key-value形式的容器,map/hash_map/unordered_map/vector_map.下面讲述各个map的使用及其区别. map: #include <ios ...

随机推荐

  1. codeforces 319B Psychos in a Line(模拟)

    There are n psychos standing in a line. Each psycho is assigned a unique integer from 1 to n. At eac ...

  2. Thunder团队第六周 - Scrum会议2

    Scrum会议2 小组名称:Thunder 项目名称:i阅app Scrum Master:宋雨 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传康 ...

  3. [离散化]人潮最多的時段( Interval Partitioning Problem )

    範例:人潮最多的時段( Interval Partitioning Problem ) 一群訪客參加宴會,我們詢問到每一位訪客的進場時刻與出場時刻,請問宴會現場擠進最多人的時段. 換個角度想,想像會場 ...

  4. TCP源码—系统调用

    1.socket SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) sys_socket->sock_create-& ...

  5. 【week4】技术随笔psp

    本周psp

  6. 原生js移动端字体自适应方案

    自从进入新公司之后,就一直采用800的方案,也就是判断屏幕尺寸,大于800px是一种html字体处理方案,另一种方案是小于800px的html字体处理方案, 代码如下: (function(doc, ...

  7. matlab中的静态变量

    persistent X Y Z 将X,Y,Z定义为在其声明处的函数的局部变量.然而,这些变量的值在函数调用期间在内存中保存(应该是堆区).Persistent 变量和global(全局)变量相似,因 ...

  8. BZOJ3139/BZOJ1306 HNOI2013比赛/CQOI2009循环赛(搜索)

    搜索好难啊. 1.对于每个分数集合记忆化. 2.某人得分超过总分,剪枝. 3.某人之后全赢也无法达到总分,剪枝. 4.每有一场比赛分出胜负总分会多三分,而平局则会多两分.某人的分出胜负场次或平局场次超 ...

  9. 求熵 python 代码

    #coding=gbk import nltk import math def entropy(labels): freqdist = nltk.FreqDist(labels) #Frequency ...

  10. [BZOJ3380] [USACO2004 Open]Cave Cows 1 洞穴里的牛之一

    Description ​ 很少人知道其实奶牛非常喜欢到洞穴里面去探险. ​ 洞窟里有N(1≤N≤100)个洞室,由M(1≤M≤1000)条双向通道连接着它们.每对洞室间 至多只有一条双向通道.有K( ...