2015-03-02 34 views
0

我是一個java傢伙..學習C++。我正在嘗試在C++中使用地圖std::map。不知何故,我也需要重寫它的哈希碼和equals方法。我可以使用unordered_map在C++ 11中做到這一點,但我怎麼能在舊版本中做到這一點。我知道在std::map,第三個參數是operator<但不是哈希碼(如在unordered_map)。我也知道std::map(有序地圖)實際上是一個TreeMap(紅黑樹)。但我怎麼做,我想要做的,使用這個數據結構或其他一些舊的c + +版本。C++舊版本(不是C++ 11) - 地圖 - >重寫哈希碼

+0

如果你使用的是舊版本的visual studio,你可以使用非標準的[stdext :: hash_map](https://msdn.microsoft.com/en-us/library/6x7w9f6z(v = vs.100) )的.aspx)。但真正的答案應該是,如果你正在學習,並且沒有任何要求使用舊的編譯器,爲什麼不只是得到一個包含C++ 11的最新工具集? – 2015-03-02 11:16:43

+0

你可能必須去[BOOST](http://www.boost.org/doc/libs/1_57_0/doc/html/unordered.html)。 – 2015-03-02 11:17:48

+1

我知道hash_map,但由於我不能使用它,因爲它不是標準庫的一部分 – Learner 2015-03-02 11:18:31

回答

5

正如您所說,std :: map與Java的TreeMap類似。在Java中重寫TreeMap的哈希代碼沒有用,因爲它不會被集合使用。相反,TreeMap需要一個(可選)附加參數:比較器。

的std ::地圖做幾乎同樣的事情,但不是一個運行參數,它有一個編譯時模板參數:

template <class Key, class T, class Compare = less<Key> [...]> 
class map; 

正如你所看到的,這個默認爲std ::少。這可以通過兩種不同的方式重寫:

  • 要麼通過選擇性專業化爲您的密鑰類型定義新的std :: less。這將其全球範圍內使用,或
  • 聲明時,你的地圖

1版提供自定義比較結構:

template<> 
struct std::less<Key> { 
    bool operator()(const &Key lhs, const Key &rhs) const 
    { 
     // compare lhs with rhs 
    } 
}; 

版本2:

struct CompareKeys { 
    bool operator()(const &Key lhs, const Key &rhs) const 
    { 
     // compare lhs with rhs 
    } 
}; 

std::map<Key, Value, CompareKeys> my_map; 

C++ 14及更高版本會稍微改變聲明,但機制mor e或更少保持不變。

+1

版本3:重載'bool操作符<(const Key&,const Key&);' – fredoverflow 2015-03-02 11:54:05

+2

但是不要因爲污染了其他所有東西。 – 2015-03-02 11:58:31