GCC中使用hash_map
来源:互联网 发布:淘宝网数据字典 编辑:程序博客网 时间:2024/06/16 12:06
GCC中使用hash_map
2009-04-01 21:34
最近学习STL,hash_map就是利用hash表实现的一个map,在查找是具有更快的效率,前提是你使用了适当的hash函数。hash_map不是STL中的一部分,但大多数C/c++的编译器都提供了这个容器。GCC也不例外,我在winds下使用的IDE是code blocks,它使用的编译器就是GCC。因为hash_map不是STL中的一部分,所以使用起来也不是很异样。下面的是我搜索到的一些资料:
【1】
http://zitronensaft.blogspot.com/2008/02/using-hashmap-on-gcc.html
Using hash_map on GCC
If you have tried to use some STL containers with GCC, such as hash_map:
// error: hash_map: No such file or directory#include <hash_map>int main(){ // error: ‘hash_map’ is not a member of ‘std’ std::hash_map<int,int> hm; return 0;}
Then you have realized that the code above does not compile. That's because on GCC, hash_map is not regarded as a standard container, but rather as a extension included in the__gnu_cxx namespace. In order to use hash_map and other extended containers with a minimum impact in your code (which is very important if it's intended to be cross-platform), you can use the following solution:
#ifdef __GNUC__#include <ext/hash_map>#else#include <hash_map>#endifnamespace std{ using namespace __gnu_cxx;}int main(){ std::hash_map<int,int> hm; return 0;}
Hope that helps.
----------------------------------------------------------------------------------------------------------------------------------
【2】
http://www.velocityreviews.com/forums/t280027-why-wont-this-hashmap-compile.html
Hi,
I'm trying to use hash_map (gcc 3.2.2) with a std::string as the key. It
will compile if I use <map> but I get a bunch of template compile errors
when I change it to hash_map. Any suggestions? My program and the errors
are below...
#include <ext/hash_map>
#include <string>
using namespace std;
__gnu_cxx::hash_map<string, int> storage;
int main()
{
pair<string, int> item("blah", 1);
storage.insert(item);
}
When compiled I get the following:
g++ hm.cpp -o hm
/usr/include/c++/3.2.2/ext/stl_hashtable.h: In member function `size_t
__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey,
_Alloc>::_M_bkt_num_key(const _Key&, unsigned int) const [with _Val =
std:
air<const std::string, int>, _Key = std::string, _HashFcn =
__gnu_cxx::hash<std::string>, _ExtractKey = std::_Select1st<std:
air<const
std::string, int> >, _EqualKey = std::equal_to<std::string>, _Alloc =
std::allocator<int>]':
/usr/include/c++/3.2.2/ext/stl_hashtable.h:522: instantiated from `size_t
__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey,
_Alloc>::_M_bkt_num(const _Val&, unsigned int) const [with _Val =
std:
air<const std::string, int>, _Key = std::string, _HashFcn =
__gnu_cxx::hash<std::string>, _ExtractKey = std::_Select1st<std:
air<const
std::string, int> >, _EqualKey = std::equal_to<std::string>, _Alloc =
std::allocator<int>]'
/usr/include/c++/3.2.2/ext/stl_hashtable.h:887: instantiated from `void
__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey,
_Alloc>::resize(unsigned int) [with _Val = std:
air<const std::string,
int>, _Key = std::string, _HashFcn = __gnu_cxx::hash<std::string>,
_ExtractKey = std::_Select1st<std:
air<const std::string, int> >, _EqualKey
= std::equal_to<std::string>, _Alloc = std::allocator<int>]'
/usr/include/c++/3.2.2/ext/stl_hashtable.h:381: instantiated from
`std:
air<__gnu_cxx::_Hashtable_iterator<_Val, _Key, _HashFcn, _ExtractKey,
_EqualKey, _Alloc>, bool> __gnu_cxx::hashtable<_Val, _Key, _HashFcn,
_ExtractKey, _EqualKey, _Alloc>::insert_unique(const _Val&) [with _Val =
std:
air<const std::string, int>, _Key = std::string, _HashFcn =
__gnu_cxx::hash<std::string>, _ExtractKey = std::_Select1st<std:
air<const
std::string, int> >, _EqualKey = std::equal_to<std::string>, _Alloc =
std::allocator<int>]'
/usr/include/c++/3.2.2/ext/hash_map:171: instantiated from
`std:
air<__gnu_cxx::hashtable<std:
air<const _Key, _Tp>, _Key, _HashFcn,
std::_Select1st<std:
air<const _Key, _Tp> >, _EqualKey, _Alloc>::iterator,
bool> __gnu_cxx::hash_map<_Key, _Tp, _HashFcn, _EqualKey,
_Alloc>::insert(__gnu_cxx::hashtable<std:
air<con st _Key, _Tp>, _Key,
_HashFcn, std::_Select1st<std:
air<const _Key, _Tp> >, _EqualKey,
_Alloc>::value_type&) [with _Key = std::string, _Tp = int, _HashFcn =
__gnu_cxx::hash<std::string>, _EqualKey = std::equal_to<std::string>, _Alloc
= std::allocator<int>]'
hm.cpp:14: instantiated from here
/usr/include/c++/3.2.2/ext/stl_hashtable.h:517: no match for call to `(const
__gnu_cxx::hash<std::string>) (const std::basic_string<char,
std::char_traits<char>, std::allocator<char> >&)'
make: *** [hm] Error 1
I'm trying to use hash_map (gcc 3.2.2) with a std::string as the key. It
will compile if I use <map> but I get a bunch of template compile errors
when I change it to hash_map. Any suggestions? My program and the errors
are below...
#include <ext/hash_map>
#include <string>
using namespace std;
__gnu_cxx::hash_map<string, int> storage;
int main()
{
pair<string, int> item("blah", 1);
storage.insert(item);
}
When compiled I get the following:
g++ hm.cpp -o hm
/usr/include/c++/3.2.2/ext/stl_hashtable.h: In member function `size_t
__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey,
_Alloc>::_M_bkt_num_key(const _Key&, unsigned int) const [with _Val =
std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
__gnu_cxx::hash<std::string>, _ExtractKey = std::_Select1st<std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
std::string, int> >, _EqualKey = std::equal_to<std::string>, _Alloc =
std::allocator<int>]':
/usr/include/c++/3.2.2/ext/stl_hashtable.h:522: instantiated from `size_t
__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey,
_Alloc>::_M_bkt_num(const _Val&, unsigned int) const [with _Val =
std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
__gnu_cxx::hash<std::string>, _ExtractKey = std::_Select1st<std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
std::string, int> >, _EqualKey = std::equal_to<std::string>, _Alloc =
std::allocator<int>]'
/usr/include/c++/3.2.2/ext/stl_hashtable.h:887: instantiated from `void
__gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey,
_Alloc>::resize(unsigned int) [with _Val = std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
int>, _Key = std::string, _HashFcn = __gnu_cxx::hash<std::string>,
_ExtractKey = std::_Select1st<std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
= std::equal_to<std::string>, _Alloc = std::allocator<int>]'
/usr/include/c++/3.2.2/ext/stl_hashtable.h:381: instantiated from
`std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
_EqualKey, _Alloc>, bool> __gnu_cxx::hashtable<_Val, _Key, _HashFcn,
_ExtractKey, _EqualKey, _Alloc>::insert_unique(const _Val&) [with _Val =
std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
__gnu_cxx::hash<std::string>, _ExtractKey = std::_Select1st<std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
std::string, int> >, _EqualKey = std::equal_to<std::string>, _Alloc =
std::allocator<int>]'
/usr/include/c++/3.2.2/ext/hash_map:171: instantiated from
`std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
std::_Select1st<std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
bool> __gnu_cxx::hash_map<_Key, _Tp, _HashFcn, _EqualKey,
_Alloc>::insert(__gnu_cxx::hashtable<std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
_HashFcn, std::_Select1st<std:
![Razz](http://www.velocityreviews.com/forums/images/smilies/icon_razz.gif)
_Alloc>::value_type&) [with _Key = std::string, _Tp = int, _HashFcn =
__gnu_cxx::hash<std::string>, _EqualKey = std::equal_to<std::string>, _Alloc
= std::allocator<int>]'
hm.cpp:14: instantiated from here
/usr/include/c++/3.2.2/ext/stl_hashtable.h:517: no match for call to `(const
__gnu_cxx::hash<std::string>) (const std::basic_string<char,
std::char_traits<char>, std::allocator<char> >&)'
make: *** [hm] Error 1
Mark
-----------------------------------------------------------------------------------------------------------------------------------
【3】
Re: gcc-3.0.2 + hash_map<string,int> compilation problems
- From: Stefan Olsson <stefan at noname4us dot com>
- To: Matthew Sundling <sundlm at cs dot wisc dot edu>
- Cc: libstdc++ at gcc dot gnu dot org
- Date: Mon, 08 Apr 2002 23:42:45 +0200
- Subject: Re: gcc-3.0.2 + hash_map<string,int> compilation problems
- Organization: Noname4us
- References: <Pine.GSO.4.21.0204081557530.14231-100000@nova5.cs.wisc.edu>
Hi!I have had the same issue and solved it by declaring:#include <string>#include <ext/hash_map>namespace __gnu_cxx{ template<> struct hash< std::string > { size_t operator()( const std::string& x ) const { return hash< const char* >()( x.c_str() ); } };}I guess that the reason for not having this declared in the std::string is that the hash* are extensions to the standard. Maybe something like the above could be added into the codebase somewhere else?Hope that helps!/StefanMatthew Sundling wrote:>I have been trying to compile an extremely simple program that>uses a hash_map<string, int>. I can't quit figure out what the>errors are telling to supply to the STL container to satisfy it.>>Thanks for any insight you might have:>>[---------------------------------------------------------------]>My program:>>#include <iostream>>#include <string>>#include <ext/hash_map>>>int main () {> std::hash_map<std::string, int > str_hash;> str_hash["text"] = 1;> std::cout << str_hash["test"] << std::endl;> return 0;>}>>>[---------------------------------------------------------------]>My gcc output:>>/s/unsup/include/g++-v3/ext/stl_hashtable.h: In member function>`size_t std::hashtable<_Val, _Key, _HashFcn, _ExtractKey, >_EqualKey, _Alloc>::_M_bkt_num_key(const _Key&, unsigned int) const >[with _Val = std::pair<const std::string, int>, >_Key = std::string,>_HashFcn = std::hash<std::string>, >_ExtractKey = std::_Select1st<std::pair<const std::string, int>>>>, >>>_EqualKey = std::equal_to<std::string>,>_Alloc = std::allocator<int>]':>>/s/unsup/include/g++-v3/ext/stl_hashtable.h:512: instantiated>from `size_t std::hashtable<_Val, _Key, _HashFcn, _ExtractKey,>_EqualKey, _Alloc>::_M_bkt_num(const _Val&, unsigned int) const>[with _Val = std::pair<const std::string, int>, >_Key = std::string, _HashFcn = std::hash<std::string>,>_ExtractKey = std::_Select1st<std::pair<const std::string, int>>>>, >>>_EqualKey = std::equal_to<std::string>, >_Alloc = std::allocator<int>]'>>/s/unsup/include/g++-v3/ext/stl_hashtable.h:856: instantiated>from `void std::hashtable<_Val, _Key, _HashFcn, _ExtractKey,>_EqualKey, _Alloc>::resize(unsigned int) >[with _Val = std::pair<const std::string, int>, >_Key = std::string, >_HashFcn = std::hash<std::string>, >_ExtractKey = std::_Select1st<std::pair<const std::string, int>>>>, >>>_EqualKey = std::equal_to<std::string>, >_Alloc = std::allocator<int>]'>>/s/unsup/include/g++-v3/ext/stl_hashtable.h:669: instantiated>from `_Val& std::hashtable<_Val, _Key, _HashFcn, _ExtractKey,>_EqualKey, _Alloc>::find_or_insert(const _Val&) >[with _Val = std::pair<const std::string, int>, >_Key = std::string, >_HashFcn = std::hash<std::string>, >_ExtractKey = std::_Select1st<std::pair<const std::string, int>>>>, >>>_EqualKey = std::equal_to<std::string>, >_Alloc = std::allocator<int>]'>>/s/unsup/include/g++-v3/ext/hash_map:173: instantiated from>`_Tp& std::hash_map<_Key, _Tp, _HashFcn, _EqualKey,>_Alloc>::operator[](typename std::hashtable<std::pair<const _Key,>_Tp>, _Key, _HashFcn, std::_Select1st<std::pair<const _Key, _Tp>>>>, _EqualKey, _Alloc>::key_type&) >>>[with _Key = std::string, >_Tp = int, >_HashFcn = std::hash<std::string>, >_EqualKey = std::equal_to<std::string>, >_Alloc = std::allocator<int>]'>>src/junk.cpp:7: instantiated from here>/s/unsup/include/g++-v3/ext/stl_hashtable.h:507: no match for>call to `(const std::hash<std::string>) (const std::basic_string<char, > std::char_traits<char>, std::allocator<char> >&)'>>>Thanks!>Matt>>------------------>Matthew Sundling>sundlm@cs.wisc.edu>>>看了上面三个资料后,我想你可以像使用一个map一样使用hash_map了。转自 http://hi.baidu.com/lr02/blog/item/7aca821c2294f78787d6b6a5.html
- GCC中使用hash_map
- 在GCC和Visual Studio中使用hash_map
- 在GCC和Visual Studio中使用hash_map
- 在GCC和Visual Studio中使用hash_map
- GCC hash_map中string为key的解决方法[Linux]
- vc++2005 和 g++中使用hash_map
- VC中使用STL的hash_map
- hash_map 使用
- 【转】Using hash_map on GCC
- VC的hash_map和GCC hash_map用法区别
- 在vs中使用hash_map的一个小总结
- STL中hash_map深度剖析—使用自定义类型
- gcc中使用uuidof
- GCC中使用SIMD
- GCC中使用itoa()
- C++中hash_map用法
- C++中hash_map用法
- 一个hash_map使用错误
- 3D游戏从头编--第八回:纹理
- 3D游戏从头编--第九回: 3D模型(.x)
- FCKeditor限制图片上传尺寸
- (整理).net面试之葵花宝典
- struts面试常见问题2
- GCC中使用hash_map
- [WPF] 继承 FrameworkElement 并覆写 OnRender
- 转载:百度 新浪门户网站运维工程师
- bootloader分析(BOIS)
- so库的性能注意事项
- 网页地图怎么做呢?
- Linux下的段错误产生的原因及调试方法
- android系统服务---大宝点
- linux中静态库(.a)和动态库(.so)