在使用hash_map的程序中,编译的时候会报出warning,
In file included from /usr/include/c++/4.4/ext/hash_map:60,
from hash_a.h:6,
from test.cpp:5:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date.
提示说编译时使用-Wno-deprecated选项使得不再提示这种错误。
既然c++0x已经成为标准的一部分,我们何不使用新的标准提供的unordered_map呢?
先简单看一下hash_map的使用,需要自己实现字符串的hash函数和比较函数。如下,
#include <string>using std::string;#include <ext/hash_map>using namespace __gnu_cxx;struct str_hash{ size_t operator()(const string& s) const { return __stl_hash_string(s.c_str()); }};struct str_compare{ int operator()(const string& a,const string& b) const { return (a==b); }};
同样的,对unordered_map,也需要使用自己定义的hash函数和比较函数(对string似乎是支持的,不需要自己定义hash函数)。与hash_map不同的是,这里需要的是class类型的函数,其成员为hash函数和比较函数,需要是公有成员。
与hash_map相同的是,需要参数为const,函数为const。注意这两个const,缺少的时候会报出一长串的错误信息。如下,
#include <string>using std::string;#include <unordered_map>using std::unordered_map;unsigned int JSHash(const char *str){ unsigned int hash = 1315423911; while (*str){ hash ^= ((hash << 5) + (*str++) + (hash >> 2)); } return (hash & 0x7FFFFFFF);}class StrHash{public: size_t operator()(const string& s) const { return JSHash(s.c_str()); }};class StrCompare{public: bool operator()(const string& a,const string& b) const { return (a==b); }};
当使用unordered_map的时候,编译的时候需要加上选项--std=c++0x。
简单的测试程序如下,
int main(){ hash_map<string,int,str_hash,str_compare> strMap; string a,b; a = "abc"; strMap[a] = 3; a = "abcde"; strMap[a] = 5; a = "abdec"; strMap[a] = 55; b = a; if(strMap.find(b)!=strMap.end()) cout << strMap[b] << endl; else cout << "not found " << b << endl; unordered_map<string,int,StrHash,StrCompare> StrMap; a = "abc"; StrMap[a] = 3; a = "abcde"; StrMap[a] = 5; a = "abdec"; StrMap[a] = 55; b = a; if(StrMap.find(b)!=StrMap.end()) cout << StrMap[b] << endl; else cout << "not found " << b << endl; unordered_map<string,int> theMap; a = "abc"; theMap[a] = 3; a = "abcde"; theMap[a] = 5; a = "abdec"; theMap[a] = 55; b = a; if(theMap.find(b)!=theMap.end()) cout << theMap[b] << endl; else cout << "not found " << b << endl; return 0;}
unordered_map在cplusplus上没有找到类的说明,在msdn上可以找到,
http://msdn.microsoft.com/en-us/library/bb982522.aspx
对Hash函数,有两个地方写的比较好,链接如下,
http://www.cppblog.com/bellgrade/archive/2009/10/06/97926.aspx
http://www.byvoid.com/blog/string-hash-compare/
关于unordered_map的一些参考,
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01312.html
http://en.wikipedia.org/wiki/Unordered_map_(C%2B%2B)
unordered_map的使用的参考,
http://www.cppblog.com/newplan/archive/2008/12/13/48912.html
共同学习下。
原文链接: https://www.cnblogs.com/Frandy/archive/2011/07/26/Hash_map_Unordered_map.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/29348
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!