<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    hash_map和map的區別

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    hash_map和map的區別

    分類: STL2008-10-15 21:24 5444人閱讀 評論(0) 收藏 舉報 class數據結構編譯器存儲平臺tree

    這里列幾個常見問題,應該對你理解和使用hash_map比較有幫助。

    4.1 hash_map和map的區別在哪里?

    • 構造函數。hash_map需要hash函數,等于函數;map只需要比較函數(小于函數).
    • 存儲結構。hash_map采用hash表存儲,map一般采用紅黑樹(RB Tree)實現。因此其memory數據結構是不一樣的。

    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函數,定義等于比較函數。下面的代碼是一個例子:

    #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=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;

    }


     

    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不是標準的?

    具體為什么不 是標準的,我也不清楚,有個解釋說在STL加入標準C++之時,hash_map系列當時還沒有完全實現,以后應該會成為標準。如果誰知道更合理的解釋,也希望告訴我。但我想表達的是,正是因為hash_map不是標準的,所以許多平臺上安裝了g++編譯器,不一定有hash_map的實現。我就遇到了這樣的例子。因此在使用這些非標準庫的時候,一定要事先測試。另外,如果考慮到平臺移植,還是少用為佳。

    4.6 有學習使用hash_map的建議嗎?

    hash中文是哈希,也成為散列,聽見別人說散列容器不要埋怨自己孤陋寡聞。了解hash系列,你還可以看看這篇文章:effective STL 25: 熟悉非標準散列容器, 另外建議查看源代碼。如果還有問題,那么你可以在STL論壇上提問,會有高手回答你的。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全