為什麼在C 中, 只要實現了比較符過載, 就可以做map的key?

時間 2021-06-05 11:52:24

1樓:

1. 比較淺層的理解是, 因為map是個有序的關聯容器,而對諸如map\multimap\set\multiset等有序容器來說,關鍵字型別必須定義元素的比較方法,預設情況下,標準庫使用關鍵字型別《運算子來比較兩個關鍵字--這是要求。

2. 至於內部機理, 那實際上能做兩個操作就可以找到相等元素達到目的:可以遍歷;可以比較大小;通過《號來找到相等元素顯然是可行的, 左右元素互換,即不大於也不小於那就是相等了,實現可以通過stl實現版本檢視, 不過這個版本寫的好繞。

其他答主給出的實現可能更好讀。

typename

_Rb_tree

<_Key

,_Value

,_KeyOfValue

,_Compare

,_Alloc

>::

iterator

_Rb_tree

<_Key

,_Value

,_KeyOfValue

,_Compare

,_Alloc

>::

find

(const

_Key

&__k

)不過這樣實現是一定要遍歷到 x=0的時候才會跳出迴圈, 從效率上來說,還不如 @趙闊 給出的方式, 不知出於何種考慮, 有知道的同學可以指點一二~

因為等於是用 !(a>b)&&!(b>a) 來實現的

2樓:暗黑謝廣坤

我感覺前面的回答有點偏了,內部實現的機理應歸於C++編譯器。

這個問題應該分兩點,

1、為什麼map會允許《過載的類例項做key,這一點前面已經有人回答了。

2、這樣玩是由什麼原理支撐的,這個就是C艹中的模板例項化了,是C艹編譯器幹的好事情

3樓:Leon

因為map是使用樹來做儲存的資料結構的,而為了效率所以大多數實現會選擇相對平衡的紅黑樹來實現。而這個東西是要通過比較來使得樹平衡的。所以map中的元素一定要可以比較。

但不是任何比較操作符都可以,map是要求必須實現或過載了 「 < 」操作符的才可以。

關於實現參考Red

另外c++11新加的unordered_map 由於使用雜湊表作為資料結構,這個就不需要其中的型別實現比較操作符了

C 遞增運算子過載中為什麼是後置遞增接受乙個額外的的形參而不是前置遞增?

我猜 僅僅是我猜 C 語言設計者可能認為,假設 是乙個一元運算子,那麼使用該運算子的最自然形式是 運算數 而不是 運算數 例如,使用非運算子 的形式是 valid 而不是 valid 使用取反運算子 的形式是 integer 而不是 integer 等等。因此,C 語言設計者可能認為,與後置自增運算...

為什麼同樣的日系戰艦,在艦C中很強,在艦N中就很弱?

單純的日黑而已,何來的還原歷史?ps 樓上居然有人說長門是七大墊底 日本重巡被美國吊打?一句話 請試著去戰列艦吧發個類似的帖子吧,我看你就是缺少社會的毒打.jpg Ling 日系艦船何曾強過.艦C表達出的史觀是,就IJN這種辣雞,除非日本有無限資源和無限重來的能力不然絕對幹不過美軍 ijn強?一改厭...

為什麼C 中在析構函式中使用delete p和在普通函式中用產生不一樣的結果?

shzy delete指標後立馬賦值nullptr,並不 總 是乙個好習慣。他可能會掩蓋一些錯誤並使你的程式看似良好的繼續執行。因為delete nullptr在c 標準中有明確的定義。C 盡量總在析構裡delete,用raii管理資源。如果你偶然想嘗試delete後置空,八成是因為你無法確定指標接...