r10 - 22 Sep 2005 - 04:48:45 - WinterWenYou are here: TWiki >  Main Web  > WebLeftBar > STLChina > STLDetailHashMap

Ïêϸ½â˵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½øÐÐÓ³Éäµ½²»Í¬ÇøÓò£¨Í°£©½øÐб£´æ¡£Æä²åÈë¹ý³ÌÊÇ£º

  1. µÃµ½key
  2. ͨ¹ýhashº¯ÊýµÃµ½hashÖµ
  3. µÃµ½Í°ºÅ(Ò»°ã¶¼ÎªhashÖµ¶ÔͰÊýÇóÄ£)
  4. ´æ·ÅkeyºÍvalueÔÚͰÄÚ¡£
Æäȡֵ¹ý³ÌÊÇ:
  1. µÃµ½key
  2. ͨ¹ýhashº¯ÊýµÃµ½hashÖµ
  3. µÃµ½Í°ºÅ(Ò»°ã¶¼ÎªhashÖµ¶ÔͰÊýÇóÄ£)
  4. ±È½ÏͰµÄÄÚ²¿ÔªËØÊÇ·ñÓëkeyÏàµÈ£¬Èô¶¼²»ÏàµÈ£¬ÔòûÓÐÕÒµ½¡£
  5. È¡³öÏàµÈµÄ¼Ç¼µÄ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());
        }
};
ÔÚÉùÃ÷×Ô¼ºµÄ¹þÏ£º¯ÊýʱҪעÒâÒÔϼ¸µã£º
  1. ʹÓÃstruct£¬È»ºóÖØÔØoperator().
  2. ·µ»ØÊÇsize_t
  3. ²ÎÊýÊÇÄãÒªhashµÄkeyµÄÀàÐÍ¡£
  4. º¯ÊýÊÇconstÀàÐ͵ġ£
Èç¹ûÕâЩ±È½ÏÄѼǣ¬×î¼òµ¥µÄ·½·¨¾ÍÊÇÕÕè»­»¢£¬ÕÒÒ»¸öº¯Êý¸Ä¸Ä¾ÍÊÇÁË¡£

ÏÖÔÚ¿ÉÒÔ¶Ô¿ªÍ·µÄ"ÔÀ²»Èº"½øÐйþÏ£»¯ÁË smile . Ö±½ÓÌæ»»³ÉÏÂÃæµÄÉùÃ÷¼´¿É£º

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£¬ÕâÀïÖ÷Òª½éÉܼ¸¸ö³£Óú¯Êý¡£
  1. hash_map(size_type n) Èç¹û½²¾¿Ð§ÂÊ£¬Õâ¸ö²ÎÊýÊDZØÐëÒªÉèÖõġ£n Ö÷ÒªÓÃÀ´ÉèÖÃhash_map ÈÝÆ÷ÖÐhashͰµÄ¸öÊý¡£Í°¸öÊýÔ½¶à£¬hashº¯Êý·¢Éú³åÍ»µÄ¸ÅÂʾÍԽС£¬ÖØÐÂÉêÇëÄÚ´æµÄ¸ÅÂʾÍԽС¡£nÔ½´ó£¬Ð§ÂÊÔ½¸ß£¬µ«ÊÇÄÚ´æÏûºÄÒ²Ô½´ó¡£
  2. const_iterator find(const key_type& k) const. ÓòéÕÒ£¬ÊäÈëΪ¼üÖµ£¬·µ»ØÎªµü´úÆ÷¡£
  3. data_type& operator[](const key_type& k) . ÕâÊÇÎÒ×î³£ÓõÄÒ»¸öº¯Êý¡£ÒòΪÆäÌØ±ð·½±ã£¬¿ÉÏñʹÓÃÊý×éÒ»ÑùʹÓᣲ»¹ýÐèҪעÒâµÄÊÇ£¬µ±ÄãʹÓÃ[key ]²Ù×÷·ûʱ£¬Èç¹ûÈÝÆ÷ÖÐûÓÐkeyÔªËØ£¬Õâ¾ÍÏ൱ÓÚ×Ô¶¯Ôö¼ÓÁËÒ»¸ökeyÔªËØ¡£Òò´Ëµ±ÄãÖ»ÊÇÏëÖªµÀÈÝÆ÷ÖÐÊÇ·ñÓÐkeyÔªËØÊ±£¬Äã¿ÉÒÔʹÓÃfind¡£Èç¹ûÄãÏ£Íû²åÈë¸ÃÔªËØÊ±£¬Äã¿ÉÒÔÖ±½ÓʹÓÃ[]²Ù×÷·û¡£
  4. insert º¯Êý¡£ÔÚÈÝÆ÷Öв»°üº¬keyֵʱ£¬insertº¯ÊýºÍ[]²Ù×÷·ûµÄ¹¦Äܲ¶à¡£µ«Êǵ±ÈÝÆ÷ÖÐÔªËØÔ½À´Ô½¶à£¬Ã¿¸öͰÖеÄÔªËØ»áÔö¼Ó£¬ÎªÁ˱£Ö¤Ð§ÂÊ£¬hash_map»á×Ô¶¯ÉêÇë¸ü´óµÄÄڴ棬ÒÔÉú³É¸ü¶àµÄͰ¡£Òò´ËÔÚinsertÒÔºó£¬ÒÔǰµÄiteratorÓпÉÄÜÊDz»¿ÉÓõġ£
  5. 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 ²Î¿¼ÎÄÕÂ:

  1. Ïêϸ½â˵ STL ÅÅÐò(Sort)
  2. Ïêϸ½â˵ STL string
  3. Effective STL ÖÐÎİæ
  4. ÂÛ̳ÌÖÂÛ:STLÂÛ̳: Ïêϸ½â˵STL hash_mapϵÁÐ

Edit | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r10 < r9 < r8 < r7 < r6 | More topic actions
 
Powered by TWiki
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback