Hash_Map 與 Map的區別

來源:互聯網
上載者:User

1.1 hash_map和map的區別在哪裡?



建構函式。hash_map需要hash函數,等於函數;map只需要比較函數(小於函數). 

儲存結構。hash_map採用hash表格儲存體,map一般採用紅/黑樹狀結構(RB Tree)實現。因此其memory資料結構是不一樣的。 

1.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

1.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

1.4如何用hash_map替換程式中已有的map容器?

這個很容易,但需要你有良好的編程風格。建議你盡量使用typedef來定義你的類型:

typedef map<Key, Value> KeyMap;

當你希望使用hash_map來替換的時候,只需要修改:

typedef hash_map<Key, Value> KeyMap;

其他的基本不變。當然,你需要注意是否有Key類型的hash函數和比較函數。

1.5為什麼hash_map不是標準的?

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.