,我們獲得了像hashCode()和equals()這樣的方法,供地圖使用它們來標識每個對象。 C++沒有這樣的基本方法,每個對象都默認實現。在C++中以Java開發人員的身份瞭解Map作爲Java開發人員
地圖現在如何使用自定義對象作爲關鍵值?
編輯:沒有重複的,因爲it's尤其是瞄向那些特定於Java的接口方法,別人誰都沒動過用C++做會尋找
,我們獲得了像hashCode()和equals()這樣的方法,供地圖使用它們來標識每個對象。 C++沒有這樣的基本方法,每個對象都默認實現。在C++中以Java開發人員的身份瞭解Map作爲Java開發人員
地圖現在如何使用自定義對象作爲關鍵值?
編輯:沒有重複的,因爲it's尤其是瞄向那些特定於Java的接口方法,別人誰都沒動過用C++做會尋找
首先,在C++中std::map
一般是紅黑樹,而不是一個哈希表。在C++ 11中還有一個名爲std::unordered_map
的散列圖。默認情況下,它使用operator<
來比較元素。你也可以插入一個自定義的比較器,它可以使用任何你想要的比較。這是通過使用std::map
的可選第三個模板參數完成的。
C++ std::map
是一個有序圖,與意味着它要求實現爲自平衡二叉搜索樹(通常是紅黑樹)。這意味着密鑰類型必須具有某種strict weak ordering,它可以以less-than
運算符的形式出現,也可以作爲用戶定義的比較函數。
關於如何使用std::map
和用戶定義類型作爲關鍵字,有很多SO帖子(請參閱one example here)。
C++ 11具有std::unordered_map
,這與上鍵類型不同的要求(具體地,散列函數和相等比較被要求)
地圖在C++中的哈希表中未HashMap的,而是一個有序圖(通常實施爲紅黑樹)。使用比較器功能通過鍵對條目進行排序。在默認實現中,密鑰必須重載operator<
,但您可以指定自己的比較器功能。
在這裏看到C++的地圖資訊:http://en.cppreference.com/w/cpp/container/map
Java的哈希映射的時間複雜度爲O(1)。在C++中,基於紅黑樹的地圖的時間複雜度爲O(logN)。
CSLM是hread-safe
,concurrent
和TreeMap
不是。 CSLM在JDK 1.6
C++地圖是一個有序圖,而不是一個散列映射,模板使用布爾表達式排版(A,B)來比較鍵值。執行(A < B)比較的默認值較小,在C++中可以通過類重載該比較。備用映射可以使用不同的表達式。
std :: map是一個模板類。密鑰必須匹配某個概念稱爲嚴格弱序這保證:
下面是與自定義類型作爲鍵的示例:
#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模板,以將自定義類型保存爲散列鍵。