Ïêϸ½â˵STL hash_mapϵÁÐ
ÌõÌõ´ó·ͨÂÞÂí£¬ÎªÊ²Ã´Äã²»Ëæ±ãѡһÌõ£¿
0 ΪʲôÐèÒªhash_map
Óùýmap°É£¿mapÌṩһ¸öºÜ³£ÓõŦÄÜ£¬ÄǾÍÊÇÌṩkey-valueµÄ´æ´¢ºÍ²éÕÒ¹¦ÄÜ¡£ÀýÈ磬ÎÒÒª¼Ç¼һ¸öÈËÃûºÍÏàÓ¦µÄ´æ´¢£¬¶øÇÒËæÊ±Ôö¼Ó£¬Òª¿ìËÙ²éÕÒºÍÐ޸ģº
ÔÀ²»Èº£»ªÉ½ÅÉÕÆÃÅÈË£¬È˳ƾý×Ó½£
ÕÅÈý·á£Îäµ±ÕÆÃÅÈË£¬Ì«¼«È´´Ê¼ÈË
¶«·½²»°Ü£µÚÒ»¸ßÊÖ£¬¿û»¨±¦µä
...
ÕâЩÐÅÏ¢Èç¹û±£´æÏÂÀ´²¢²»¸´ÔÓ£¬µ«ÊÇÕÒÆðÀ´±È½ÏÂé·³¡£ÀýÈçÎÒÒªÕÒ"ÕÅÈý·á"µÄÐÅÏ¢£¬×îɵµÄ·½·¨¾ÍÊÇÈ¡µÃËùÓеļǼ£¬È»ºó°´ÕÕÃû×ÖÒ»¸öÒ»¸ö±È½Ï¡£Èç¹ûÒªËٶȿ죬¾ÍÐèÒª°ÑÕâЩ¼Ç¼°´ÕÕ×Öĸ˳ÐòÅÅÁУ¬È»ºó°´ÕÕ¶þ·Ö·¨²éÕÒ¡£µ«ÊÇÔö¼Ó¼Ç¼µÄʱºòͬʱÐèÒª±£³Ö¼Ç¼ÓÐÐò£¬Òò´ËÐèÒª²åÈëÅÅÐò¡£¿¼Âǵ½Ð§ÂÊ£¬Õâ¾ÍÐèÒªÓõ½¶þ²æÊ÷¡£½²ÏÂÈ¥»áûÍêûÁË£¬Èç¹ûÄãʹÓÃSTL µÄmapÈÝÆ÷£¬Äã¿ÉÒԷdz£·½±ãµÄʵÏÖÕâ¸ö¹¦ÄÜ£¬¶ø²»ÓùØÐÄÆäϸ½Ú¡£¹ØÓÚmapµÄÊý¾Ý½á¹¹Ï¸½Ú£¬¸ÐÐËȤµÄÅóÓÑ¿ÉÒԲο´
ѧϰSTL map, STL setÖ®Êý¾Ý½á¹¹»ù´¡¡£
¿´¿´mapµÄʵÏÖ:
#include <map>
#include <string>
using namespace std;
...
map<string, string> namemap;
//Ôö¼Ó¡£¡£¡£
namemap["ÔÀ²»Èº"]="»ªÉ½ÅÉÕÆÃÅÈË£¬È˳ƾý×Ó½£";
namemap["ÕÅÈý·á"]="Îäµ±ÕÆÃÅÈË£¬Ì«¼«È´´Ê¼ÈË";
namemap["¶«·½²»°Ü"]="µÚÒ»¸ßÊÖ£¬¿û»¨±¦µä";
...
//²éÕÒ¡£¡£
if(namemap.find("ÔÀ²»Èº") != namemap.end()){
...
}
²»¾õµÃÓÃÆðÀ´ºÜeasyÂ𣿶øÇÒЧÂʺܸߣ¬100ÍòÌõ¼Ç¼£¬×î¶àÒ²Ö»Òª20´ÎµÄstring.compareµÄ±È½Ï£¬¾ÍÄÜÕÒµ½ÄãÒªÕҵļǼ;200ÍòÌõ¼Ç¼Ê£¬Ò²Ö»ÒªÓÃ21´ÎµÄ±È½Ï¡£
ËÙ¶ÈÓÀÔ¶¶¼Âú×ã²»ÁËÏÖʵµÄÐèÇó¡£Èç¹ûÓÐ100ÍòÌõ¼Ç¼£¬ÎÒÐèҪƵ·±½øÐÐËÑË÷ʱ£¬20´Î±È½ÏÒ²»á³ÉΪƿ¾±£¬ÒªÊÇÄܽµµ½Ò»´Î»òÕßÁ½´Î±È½ÏÊÇ·ñÓпÉÄÜ£¿¶øÇÒµ±¼Ç¼Êýµ½200ÍòµÄʱºòÒ²ÊÇÒ»´Î»òÕßÁ½´ÎµÄ±È½Ï£¬ÊÇ·ñÓпÉÄÜ£¿¶øÇÒ»¹ÐèÒªºÍmapÒ»ÑùµÄ·½±ãʹÓá£
´ð°¸Êǿ϶¨µÄ¡£ÕâʱÄãÐèÒªhas_map. ËäÈ»hash_mapĿǰ²¢Ã»ÓÐÄÉÈëC++ ±ê׼ģ°å¿âÖУ¬µ«¼¸ºõÿ¸ö°æ±¾µÄSTL¶¼ÌṩÁËÏàÓ¦µÄʵÏÖ¡£¶øÇÒÓ¦ÓÃÊ®·Ö¹ã·º¡£ÔÚÕýʽʹÓÃhash_map֮ǰ£¬ÏÈ¿´¿´hash_mapµÄÔÀí¡£
1 Êý¾Ý½á¹¹£ºhash_mapÔÀí
ÕâÊÇÒ»½ÚÈÃÄãÉîÈëÀí½âhash_mapµÄ½éÉÜ£¬Èç¹ûÄãÖ»ÊÇÏëàñàðÍÌÔæ£¬²»ÏëÀí½âÆäÔÀí£¬Äãµ¹ÊÇ¿ÉÒÔÂÔ¹ýÕâÒ»½Ú£¬µ«ÎÒ»¹Êǽ¨ÒéÄã¿´¿´£¬¶àÁ˽âһЩûÓлµ´¦¡£
hash_map»ùÓÚhash table£¨¹þÏ£±í£©¡£ ¹þÏ£±í×î´óµÄÓŵ㣬¾ÍÊǰÑÊý¾ÝµÄ´æ´¢ºÍ²éÕÒÏûºÄµÄʱ¼ä´ó´ó½µµÍ£¬¼¸ºõ¿ÉÒÔ¿´³ÉÊdz£Êýʱ¼ä£»¶ø´ú¼Û½ö½öÊÇÏûºÄ±È½Ï¶àµÄÄڴ档Ȼ¶øÔÚµ±Ç°¿ÉÀûÓÃÄÚ´æÔ½À´Ô½¶àµÄÇé¿öÏ£¬Óÿռ任ʱ¼äµÄ×ö·¨ÊÇÖµµÃµÄ¡£ÁíÍ⣬±àÂë±È½ÏÈÝÒ×Ò²ÊÇËüµÄÌØµãÖ®Ò»¡£
Æä»ù±¾ÔÀíÊÇ£ºÊ¹ÓÃÒ»¸öϱ귶Χ±È½Ï´óµÄÊý×éÀ´´æ´¢ÔªËØ¡£¿ÉÒÔÉè¼ÆÒ»¸öº¯Êý£¨¹þÏ£º¯Êý£¬Ò²½Ð×öÉ¢Áк¯Êý£©£¬Ê¹µÃÿ¸öÔªËØµÄ¹Ø¼ü×Ö¶¼ÓëÒ»¸öº¯ÊýÖµ£¨¼´Êý×éϱ꣬hashÖµ£©Ïà¶ÔÓ¦£¬ÓÚÊÇÓÃÕâ¸öÊý×éµ¥ÔªÀ´´æ´¢Õâ¸öÔªËØ£»Ò²¿ÉÒÔ¼òµ¥µÄÀí½âΪ£¬°´Õչؼü×ÖΪÿһ¸öÔªËØ¡°·ÖÀࡱ£¬È»ºó½«Õâ¸öÔªËØ´æ´¢ÔÚÏàÓ¦¡°ÀࡱËù¶ÔÓ¦µÄµØ·½£¬³ÆÎªÍ°¡£
µ«ÊÇ£¬²»Äܹ»±£Ö¤Ã¿¸öÔªËØµÄ¹Ø¼ü×ÖÓ뺯ÊýÖµÊÇÒ»Ò»¶ÔÓ¦µÄ£¬Òò´Ë¼«ÓпÉÄܳöÏÖ¶ÔÓÚ²»Í¬µÄÔªËØ£¬È´¼ÆËã³öÁËÏàͬµÄº¯ÊýÖµ£¬ÕâÑù¾Í²úÉúÁË¡°³åÍ»¡±£¬»»¾ä»°Ëµ£¬¾ÍÊǰѲ»Í¬µÄÔªËØ·ÖÔÚÁËÏàͬµÄ¡°Àࡱ֮ÖС£ ×ܵÄÀ´Ëµ£¬¡°Ö±½Ó¶¨Ö·¡±Óë¡°½â¾ö³åÍ»¡±ÊǹþÏ£±íµÄÁ½´óÌØµã¡£
hash_map£¬Ê×ÏÈ·ÖÅäÒ»´óƬÄڴ棬ÐγÉÐí¶àͰ¡£ÊÇÀûÓÃhashº¯Êý£¬¶Ôkey½øÐÐÓ³Éäµ½²»Í¬ÇøÓò£¨Í°£©½øÐб£´æ¡£Æä²åÈë¹ý³ÌÊÇ£º
- µÃµ½key
- ͨ¹ýhashº¯ÊýµÃµ½hashÖµ
- µÃµ½Í°ºÅ(Ò»°ã¶¼ÎªhashÖµ¶ÔͰÊýÇóÄ£)
- ´æ·ÅkeyºÍvalueÔÚͰÄÚ¡£
Æäȡֵ¹ý³ÌÊÇ:
- µÃµ½key
- ͨ¹ýhashº¯ÊýµÃµ½hashÖµ
- µÃµ½Í°ºÅ(Ò»°ã¶¼ÎªhashÖµ¶ÔͰÊýÇóÄ£)
- ±È½ÏͰµÄÄÚ²¿ÔªËØÊÇ·ñÓëkeyÏàµÈ£¬Èô¶¼²»ÏàµÈ£¬ÔòûÓÐÕÒµ½¡£
- È¡³öÏàµÈµÄ¼Ç¼µÄvalue¡£
hash_mapÖÐÖ±½ÓµØÖ·ÓÃhashº¯ÊýÉú³É£¬½â¾ö³åÍ»£¬ÓñȽϺ¯Êý½â¾ö¡£ÕâÀï¿ÉÒÔ¿´³ö£¬Èç¹ûÿ¸öͰÄÚ²¿Ö»ÓÐÒ»¸öÔªËØ£¬ÄÇô²éÕÒµÄʱºòÖ»ÓÐÒ»´Î±È½Ï¡£µ±Ðí¶àͰÄÚûÓÐֵʱ£¬Ðí¶à²éѯ¾Í»á¸ü¿ìÁË(Ö¸²é²»µ½µÄʱºò).
Óɴ˿ɼû£¬ÒªÊµÏÖ¹þÏ£±í, ºÍÓû§Ïà¹ØµÄÊÇ£ºhashº¯ÊýºÍ±È½Ïº¯Êý¡£ÕâÁ½¸ö²ÎÊý¸ÕºÃÊÇÎÒÃÇÔÚʹÓÃhash_mapʱÐèÒªÖ¸¶¨µÄ²ÎÊý¡£
2 hash_map ʹÓÃ
2.1 Ò»¸ö¼òµ¥ÊµÀý
²»Òª×ż±ÈçºÎ°Ñ"ÔÀ²»Èº"ÓÃhash_map±íʾ£¬ÎÒÃÇÏÈ¿´Ò»¸ö¼òµ¥µÄÀý×Ó£ºËæ»ú¸øÄãÒ»¸öIDºÅºÍIDºÅÏàÓ¦µÄÐÅÏ¢£¬IDºÅµÄ·¶Î§ÊÇ1¡«2µÄ31´Î·½¡£ÈçºÎ¿ìËÙ±£´æ²éÕÒ¡£
#include <hash_map>
#include <string>
using namespace std;
int main(){
hash_map<int, string> mymap;
mymap[9527]="ÌÆ²®»¢µãÇïÏã";
mymap[1000000]="°ÙÍò¸»Î̵ÄÉú»î";
mymap[10000]="°×ÁìµÄ¹¤×ʵ×Ïß";
...
if(mymap.find(10000) != mymap.end()){
...
}
¹»¼òµ¥£¬ºÍmapʹÓ÷½·¨Ò»Ñù¡£ÕâʱÄã»òÐí»áÎÊ£¿hashº¯ÊýºÍ±È½Ïº¯ÊýÄØ£¿²»ÊÇÒªÖ¸¶¨Ã´£¿Äã˵¶ÔÁË£¬µ«ÊÇÔÚÄãûÓÐÖ¸¶¨hashº¯ÊýºÍ±È½Ïº¯ÊýµÄʱºò£¬Äã»áÓÐÒ»¸öȱʡµÄº¯Êý£¬¿´¿´hash_mapµÄÉùÃ÷£¬Äã»á¸ü¼ÓÃ÷°×¡£ÏÂÃæÊÇSGI STLµÄÉùÃ÷£º
template <class _Key, class _Tp, class _HashFcn = hash<_Key>,
class _EqualKey = equal_to<_Key>,
class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class hash_map
{
...
}
Ò²¾ÍÊÇ˵£¬ÔÚÉÏÀýÖУ¬ÓÐÒÔϵÈͬ¹ØÏµ£º
...
hash_map<int, string> mymap;
//µÈͬÓÚ:
hash_map<int, string, hash<int>, equal_to<int> > mymap;
AllocÎÒÃǾͲ»ÒªÈ¡¹Ø×¢Ì«¶àÁË(Ï£ÍûÉîÈëÁ˽âAllocatorµÄÅóÓÑ¿ÉÒԲο´
±ê×¼¿â STL £ºAllocatorÄÜ×öʲô)
2.2 hash_map µÄhashº¯Êý
hash< int>µ½µ×ÊÇʲôÑù×Ó£¿¿´¿´Ô´Âë:
struct hash<int> {
size_t operator()(int __x) const { return __x; }
};
ÔÀ´ÊǸöº¯Êý¶ÔÏó¡£ÔÚSGI STLÖУ¬ÌṩÁËÒÔÏÂhashº¯Êý£º
struct hash<char*>
struct hash<const char*>
struct hash<char>
struct hash<unsigned char>
struct hash<signed char>
struct hash<short>
struct hash<unsigned short>
struct hash<int>
struct hash<unsigned int>
struct hash<long>
struct hash<unsigned long>
Ò²¾ÍÊÇ˵£¬Èç¹ûÄãµÄkeyʹÓõÄÊÇÒÔÉÏÀàÐÍÖеÄÒ»ÖÖ£¬Äã¶¼¿ÉÒÔʹÓÃȱʡµÄhashº¯Êý¡£µ±È»Äã×Ô¼ºÒ²¿ÉÒÔ¶¨Òå×Ô¼ºµÄhashº¯Êý¡£¶ÔÓÚ×Ô¶¨Òå±äÁ¿£¬ÄãÖ»ÄÜÈç´Ë£¬ÀýÈç¶ÔÓÚstring£¬¾Í±ØÐë×Ô¶¨Òåhashº¯Êý¡£ÀýÈ磺
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);
}
};
//Èç¹ûÄãÏ£ÍûÀûÓÃϵͳ¶¨ÒåµÄ×Ö·û´®hashº¯Êý£¬Äã¿ÉÒÔÕâÑùд£º
struct str_hash{
size_t operator()(const string& str) const
{
return return __stl_hash_string(str.c_str());
}
};
ÔÚÉùÃ÷×Ô¼ºµÄ¹þÏ£º¯ÊýʱҪעÒâÒÔϼ¸µã£º
- ʹÓÃstruct£¬È»ºóÖØÔØoperator().
- ·µ»ØÊÇsize_t
- ²ÎÊýÊÇÄãÒªhashµÄkeyµÄÀàÐÍ¡£
- º¯ÊýÊÇconstÀàÐ͵ġ£
Èç¹ûÕâЩ±È½ÏÄѼǣ¬×î¼òµ¥µÄ·½·¨¾ÍÊÇÕÕè»»¢£¬ÕÒÒ»¸öº¯Êý¸Ä¸Ä¾ÍÊÇÁË¡£
ÏÖÔÚ¿ÉÒÔ¶Ô¿ªÍ·µÄ"ÔÀ²»Èº"½øÐйþÏ£»¯ÁË

. Ö±½ÓÌæ»»³ÉÏÂÃæµÄÉùÃ÷¼´¿É£º
map<string, string> namemap;
//¸ÄΪ£º
hash_map<string, string, str_hash> namemap;
ÆäËûÓ÷¨¶¼²»Óñߡ£µ±È»²»ÒªÍüÁ˰Éstr_hashµÄÉùÃ÷ÒÔ¼°Í·Îļþ¸ÄΪhash_map¡£
Äã»òÐí»áÎÊ£º±È½Ïº¯ÊýÄØ£¿±ð׿±£¬ÕâÀï¾Í¿ªÊ¼½éÉÜhash_mapÖеıȽϺ¯Êý¡£
2.3 hash_map µÄ±È½Ïº¯Êý
ÔÚmapÖеıȽϺ¯Êý£¬ÐèÒªÌṩlessº¯Êý¡£Èç¹ûûÓÐÌṩ£¬È±Ê¡µÄÒ²ÊÇless< Key> ¡£ÔÚhash_mapÖУ¬Òª±È½ÏͰÄÚµÄÊý¾ÝºÍkeyÊÇ·ñÏàµÈ£¬Òò´ËÐèÒªµÄÊÇÊÇ·ñµÈÓڵĺ¯Êý:equal_to< Key> ¡£ÏÈ¿´¿´equal_toµÄÔ´Â룺
//±¾´úÂë¿ÉÒÔ´ÓSGI STL
//ÏÈ¿´¿´binary_function º¯ÊýÉùÃ÷£¬ÆäʵֻÊǶ¨ÒåһЩÀàÐͶøÒÑ¡£
template <class _Arg1, class _Arg2, class _Result>
struct binary_function {
typedef _Arg1 first_argument_type;
typedef _Arg2 second_argument_type;
typedef _Result result_type;
};
//¿´¿´equal_toµÄ¶¨Ò壺
template <class _Tp>
struct equal_to : public binary_function<_Tp,_Tp,bool>
{
bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; }
};
Èç¹ûÄãʹÓÃÒ»¸ö×Ô¶¨ÒåµÄÊý¾ÝÀàÐÍ£¬Èçstruct mystruct, »òÕßconst char* µÄ×Ö·û´®£¬ÈçºÎʹÓñȽϺ¯Êý£¿Ê¹ÓñȽϺ¯Êý£¬ÓÐÁ½ÖÖ·½·¨. µÚÒ»ÖÖÊÇ£ºÖØÔØ==²Ù×÷·û£¬ÀûÓÃequal_to;¿´¿´ÏÂÃæµÄÀý×Ó£º
struct mystruct{
int iID;
int len;
bool operator==(const mystruct & my) const{
return (iID==my.iID) && (len==my.len) ;
}
};
ÕâÑù£¬¾Í¿ÉÒÔʹÓÃequal_to< mystruct>×÷Ϊ±È½Ïº¯ÊýÁË¡£ÁíÒ»ÖÖ·½·¨¾ÍÊÇʹÓú¯Êý¶ÔÏó¡£×Ô¶¨ÒåÒ»¸ö±È½Ïº¯ÊýÌ壺
struct compare_str{
bool operator()(const char* p1, const char*p2) const{
return strcmp(p1,p2)==0;
}
};
ÓÐÁËcompare_str£¬¾Í¿ÉÒÔʹÓÃhash_mapÁË¡£
typedef hash_map<const char*, string, hash<const char*>, compare_str> StrIntMap;
StrIntMap namemap;
namemap["ÔÀ²»Èº"]="»ªÉ½ÅÉÕÆÃÅÈË£¬È˳ƾý×Ó½£";
namemap["ÕÅÈý·á"]="Îäµ±ÕÆÃÅÈË£¬Ì«¼«È´´Ê¼ÈË";
namemap["¶«·½²»°Ü"]="µÚÒ»¸ßÊÖ£¬¿û»¨±¦µä";
2.4 hash_map º¯Êý
hash_mapµÄº¯ÊýºÍmapµÄº¯Êý²î²»¶à¡£¾ßÌ庯ÊýµÄ²ÎÊýºÍ½âÊÍ£¬Çë²Î¿´£º
STL ±à³ÌÊֲ᣺Hash_map£¬ÕâÀïÖ÷Òª½éÉܼ¸¸ö³£Óú¯Êý¡£
- hash_map(size_type n) Èç¹û½²¾¿Ð§ÂÊ£¬Õâ¸ö²ÎÊýÊDZØÐëÒªÉèÖõġ£n Ö÷ÒªÓÃÀ´ÉèÖÃhash_map ÈÝÆ÷ÖÐhashͰµÄ¸öÊý¡£Í°¸öÊýÔ½¶à£¬hashº¯Êý·¢Éú³åÍ»µÄ¸ÅÂʾÍԽС£¬ÖØÐÂÉêÇëÄÚ´æµÄ¸ÅÂʾÍԽС¡£nÔ½´ó£¬Ð§ÂÊÔ½¸ß£¬µ«ÊÇÄÚ´æÏûºÄÒ²Ô½´ó¡£
- const_iterator find(const key_type& k) const. ÓòéÕÒ£¬ÊäÈëΪ¼üÖµ£¬·µ»ØÎªµü´úÆ÷¡£
- data_type& operator[](const key_type& k) . ÕâÊÇÎÒ×î³£ÓõÄÒ»¸öº¯Êý¡£ÒòΪÆäÌØ±ð·½±ã£¬¿ÉÏñʹÓÃÊý×éÒ»ÑùʹÓᣲ»¹ýÐèҪעÒâµÄÊÇ£¬µ±ÄãʹÓÃ[key ]²Ù×÷·ûʱ£¬Èç¹ûÈÝÆ÷ÖÐûÓÐkeyÔªËØ£¬Õâ¾ÍÏ൱ÓÚ×Ô¶¯Ôö¼ÓÁËÒ»¸ökeyÔªËØ¡£Òò´Ëµ±ÄãÖ»ÊÇÏëÖªµÀÈÝÆ÷ÖÐÊÇ·ñÓÐkeyÔªËØÊ±£¬Äã¿ÉÒÔʹÓÃfind¡£Èç¹ûÄãÏ£Íû²åÈë¸ÃÔªËØÊ±£¬Äã¿ÉÒÔÖ±½ÓʹÓÃ[]²Ù×÷·û¡£
- insert º¯Êý¡£ÔÚÈÝÆ÷Öв»°üº¬keyֵʱ£¬insertº¯ÊýºÍ[]²Ù×÷·ûµÄ¹¦Äܲ¶à¡£µ«Êǵ±ÈÝÆ÷ÖÐÔªËØÔ½À´Ô½¶à£¬Ã¿¸öͰÖеÄÔªËØ»áÔö¼Ó£¬ÎªÁ˱£Ö¤Ð§ÂÊ£¬hash_map»á×Ô¶¯ÉêÇë¸ü´óµÄÄڴ棬ÒÔÉú³É¸ü¶àµÄͰ¡£Òò´ËÔÚinsertÒÔºó£¬ÒÔǰµÄiteratorÓпÉÄÜÊDz»¿ÉÓõġ£
- erase º¯Êý¡£ÔÚinsertµÄ¹ý³ÌÖУ¬µ±Ã¿¸öͰµÄÔªËØÌ«¶àʱ£¬hash_map¿ÉÄÜ»á×Ô¶¯À©³äÈÝÆ÷µÄÄÚ´æ¡£µ«ÔÚsgi stlÖÐÊÇerase²¢²»×Ô¶¯»ØÊÕÄÚ´æ¡£Òò´ËÄãµ÷ÓÃeraseºó£¬ÆäËûÔªËØµÄiterator»¹ÊÇ¿ÉÓõġ£
3 Ïà¹ØhashÈÝÆ÷
hash ÈÝÆ÷³ýÁËhash_mapÖ®Í⣬»¹ÓÐhash_set, hash_multimap, has_multiset, ÕâЩÈÝÆ÷ʹÓÃÆðÀ´ºÍset, multimap, multisetµÄÇø±ðÓëhash_mapºÍmapµÄÇø±ðÒ»Ñù£¬ÎÒÏë²»ÐèÒªÎÒһһϸ˵Á˰ɡ£
4 ÆäËû
ÕâÀïÁм¸¸ö³£¼ûÎÊÌ⣬Ӧ¸Ã¶ÔÄãÀí½âºÍʹÓÃhash_map±È½ÏÓаïÖú¡£
4.1 hash_mapºÍmapµÄÇø±ðÔÚÄÄÀ
- ¹¹Ô캯Êý¡£hash_mapÐèÒªhashº¯Êý£¬µÈÓÚº¯Êý£»mapÖ»ÐèÒª±È½Ïº¯Êý(СÓÚº¯Êý).
- ´æ´¢½á¹¹¡£hash_map²ÉÓÃhash±í´æ´¢£¬mapÒ»°ã²ÉÓúìºÚÊ÷(RB Tree)ʵÏÖ¡£Òò´ËÆämemoryÊý¾Ý½á¹¹ÊDz»Ò»ÑùµÄ¡£
4.2 ʲôʱºòÐèÒªÓÃhash_map£¬Ê²Ã´Ê±ºòÐèÒªÓÃmap?
×ÜÌåÀ´Ëµ£¬hash_map ²éÕÒËÙ¶È»á±Èmap¿ì£¬¶øÇÒ²éÕÒËÙ¶È»ù±¾ºÍÊý¾ÝÊý¾ÝÁ¿´óС£¬ÊôÓÚ³£Êý¼¶±ð;¶ømapµÄ²éÕÒËÙ¶ÈÊÇlog(n)¼¶±ð¡£²¢²»Ò»¶¨³£Êý¾Í±Èlog(n)С£¬hash»¹ÓÐhashº¯ÊýµÄºÄʱ£¬Ã÷°×Á˰ɣ¬Èç¹ûÄ㿼ÂÇЧÂÊ£¬ÌرðÊÇÔÚÔªËØ´ïµ½Ò»¶¨ÊýÁ¿¼¶Ê±£¬¿¼ÂÇ¿¼ÂÇhash_map¡£µ«ÈôÄã¶ÔÄÚ´æÊ¹ÓÃÌØ±ðÑϸñ£¬Ï£Íû³ÌÐò¾¡¿ÉÄÜÉÙÏûºÄÄڴ棬ÄÇôһ¶¨ÒªÐ¡ÐÄ£¬hash_map¿ÉÄÜ»áÈÃÄãÏÝÈëÞÏÞΣ¬ÌرðÊǵ±ÄãµÄhash_map¶ÔÏóÌØ±ð¶àʱ£¬Äã¾Í¸üÎÞ·¨¿ØÖÆÁË£¬¶øÇÒhash_mapµÄ¹¹ÔìËٶȽÏÂý¡£
ÏÖÔÚÖªµÀÈçºÎÑ¡ÔñÁËÂð£¿È¨ºâÈý¸öÒòËØ: ²éÕÒËÙ¶È, Êý¾ÝÁ¿, ÄÚ´æÊ¹Óá£
ÕâÀﻹÓиö¹ØÓÚhash_mapºÍmapµÄС¹ÊÊ£¬¿´¿´:
http://dev.csdn.net/Develop/article/14/14019.shtm
4.3 ÈçºÎÔÚhash_mapÖмÓÈë×Ô¼º¶¨ÒåµÄÀàÐÍ?
ÄãÖ»Òª×öÁ½¼þÊÂ, ¶¨Òåhashº¯Êý£¬¶¨ÒåµÈÓڱȽϺ¯Êý¡£ÏÂÃæµÄ´úÂëÊÇÒ»¸öÀý×Ó£º
-bash-2.05b$ cat my.cpp
#include <hash_map>
#include <string>
#include <iostream>
using namespace std;
//define the class
class ClassA{
public:
ClassA(int a):c_a(a){}
int getvalue()const { return c_a;}
void setvalue(int a){c_a;}
private:
int c_a;
};
//1 define the hash function
struct hash_A{
size_t operator()(const class ClassA & A)const{
// return hash<int>(classA.getvalue());
return A.getvalue();
}
};
//2 define the equal function
struct equal_A{
bool operator()(const class ClassA & a1, const class ClassA & a2)const{
return a1.getvalue() == a2.getvalue();
}
};
int main()
{
hash_map<ClassA, string, hash_A, equal_A> hmap;
ClassA a1(12);
hmap[a1]="I am 12";
ClassA a2(198877);
hmap[a2]="I am 198877";
cout<<hmap[a1]<<endl;
cout<<hmap[a2]<<endl;
return 0;
}
-bash-2.05b$ make my
c++ -O -pipe -march=pentiumpro my.cpp -o my
-bash-2.05b$ ./my
I am 12
I am 198877
4.4ÈçºÎÓÃhash_mapÌæ»»³ÌÐòÖÐÒÑÓеÄmapÈÝÆ÷£¿
Õâ¸öºÜÈÝÒ×£¬µ«ÐèÒªÄãÓÐÁ¼ºÃµÄ±à³Ì·ç¸ñ¡£½¨ÒéÄ㾡Á¿Ê¹ÓÃtypedefÀ´¶¨ÒåÄãµÄÀàÐÍ£º
typedef map<Key, Value> KeyMap;
µ±ÄãÏ£ÍûʹÓÃhash_mapÀ´Ìæ»»µÄʱºò£¬Ö»ÐèÒªÐÞ¸Ä:
typedef hash_map<Key, Value> KeyMap;
ÆäËûµÄ»ù±¾²»±ä¡£µ±È»£¬ÄãÐèҪעÒâÊÇ·ñÓÐKeyÀàÐ͵Ähashº¯ÊýºÍ±È½Ïº¯Êý¡£
4.5Ϊʲôhash_map²»ÊDZê×¼µÄ£¿
¾ßÌåΪʲô²»ÊDZê×¼µÄ£¬ÎÒÒ²²»Çå³þ£¬Óиö½âÊÍ˵ÔÚSTL¼ÓÈë±ê×¼C++֮ʱ£¬hash_mapϵÁе±Ê±»¹Ã»ÓÐÍêȫʵÏÖ£¬ÒÔºóÓ¦¸Ã»á³ÉΪ±ê×¼¡£Èç¹ûËÖªµÀ¸üºÏÀíµÄ½âÊÍ£¬Ò²Ï£Íû¸æËßÎÒ¡£µ«ÎÒÏë±í´ïµÄÊÇ£¬ÕýÊÇÒòΪhash_map²»ÊDZê×¼µÄ£¬ËùÒÔÐí¶àƽ̨Éϰ²×°ÁËg++±àÒëÆ÷£¬²»Ò»¶¨ÓÐhash_mapµÄʵÏÖ¡£ÎÒ¾ÍÓöµ½ÁËÕâÑùµÄÀý×Ó¡£Òò´ËÔÚʹÓÃÕâЩ·Ç±ê×¼¿âµÄʱºò£¬Ò»¶¨ÒªÊÂÏȲâÊÔ¡£ÁíÍ⣬Èç¹û¿¼Âǵ½Æ½Ì¨ÒÆÖ²£¬»¹ÊÇÉÙÓÃΪ¼Ñ¡£
4.6 ÓÐѧϰʹÓÃhash_mapµÄ½¨ÒéÂð£¿
hashÖÐÎÄÊǹþÏ££¬Ò²³ÉΪɢÁУ¬Ìý¼û±ðÈË˵ɢÁÐÈÝÆ÷²»ÒªÂñÔ¹×Ô¼º¹Âª¹ÑÎÅ¡£Á˽âhashϵÁУ¬Ä㻹¿ÉÒÔ¿´¿´ÕâÆªÎÄÕÂ:
effective STL 25: ÊìϤ·Ç±ê׼ɢÁÐÈÝÆ÷, ÁíÍ⽨Òé²é¿´Ô´´úÂë¡£Èç¹û»¹ÓÐÎÊÌ⣬ÄÇôÄã¿ÉÒÔÔÚ
STLÂÛ̳ÉÏÌáÎÊ£¬»áÓиßÊֻشðÄãµÄ¡£
5 ²Î¿¼ÎÄÕÂ:
- Ïêϸ½â˵ STL ÅÅÐò(Sort)
- Ïêϸ½â˵ STL string
- Effective STL ÖÐÎİæ
- ÂÛ̳ÌÖÂÛ:STLÂÛ̳: Ïêϸ½â˵STL hash_mapϵÁÐ