2014-01-14 64 views
5

,我們獲得了像hashCode()和equals()這樣的方法,供地圖使用它們來標識每個對象。 C++沒有這樣的基本方法,每個對象都默認實現。在C++中以Java開發人員的身份瞭解Map作爲Java開發人員

地圖現在如何使用自定義對象作爲關鍵值?

編輯:沒有重複的,因爲it's尤其是瞄向那些特定於Java的接口方法,別人誰都沒動過用C++做會尋找

回答

6

首先,在C++中std::map一般是紅黑樹,而不是一個哈希表。在C++ 11中還有一個名爲std::unordered_map的散列圖。默認情況下,它使用operator<來比較元素。你也可以插入一個自定義的比較器,它可以使用任何你想要的比較。這是通過使用std::map的可選第三個模板參數完成的。

5

C++ std::map是一個有序圖,與意味着它要求實現爲自平衡二叉搜索樹(通常是紅黑樹)。這意味着密鑰類型必須具有某種strict weak ordering,它可以以less-than運算符的形式出現,也可以作爲用戶定義的比較函數。

關於如何使用std::map和用戶定義類型作爲關鍵字,有很多SO帖子(請參閱one example here)。

C++ 11具有std::unordered_map,這與上鍵類型不同的要求(具體地,散列函數和相等比較被要求)

2

地圖在C++中的哈希表中未HashMap的,而是一個有序圖(通常實施爲紅黑樹)。使用比較器功能通過鍵對條目進行排序。在默認實現中,密鑰必須重載operator<,但您可以指定自己的比較器功能。

在這裏看到C++的地圖資訊:http://en.cppreference.com/w/cpp/container/map

1

Java的哈希映射的時間複雜度爲O(1)。在C++中,基於紅黑樹的地圖的時間複雜度爲O(logN)。

CSLM是hread-safe,concurrentTreeMap不是。 CSLM在JDK 1.6

見文檔加入:Java equivalent of C++ std::map?

1

C++地圖是一個有序圖,而不是一個散列映射,模板使用布爾表達式排版(A,B)來比較鍵值。執行(A < B)比較的默認值較小,在C++中可以通過類重載該比較。備用映射可以使用不同的表達式。

1

std :: map是一個模板類。密鑰必須匹配某個概念稱爲嚴格弱序這保證:

  • 鍵是低於可比(過載操作者<或給地圖的自定義比較器)
  • 如果元件A是小於乙,B不能小於
  • 如果元件A是小於B和B小於C,則A是比C

下面是與自定義類型作爲鍵的示例:

#include <map> 
#include <iostream> 
struct Custom{ Custom(int c): c(c){} int c; }; 
bool operator< (Custom const &a, Custom const &b){ return a.c< b.c; } 
int main(){ std::map<Custom, int> m; m[Custom(42)]= 42; std::cout<< m[Custom(42)]; } 

也就是說,std :: map並不是Java哈希映射的確切等價物。 C++ 11有std::unordered_map。使用unordered_map,您可以爲自己的類型定義自己的std :: hash模板,以將自定義類型保存爲散列鍵。