2010-08-05 40 views

回答

5

任何類型都只要被用作一個關鍵,因爲它感興趣的高效的索引是

  • 可複製
  • 可分配
  • 相媲美,因爲地圖是關鍵
分類

如果你的課堂只是一個簡單的結構,那麼它已經可以複製和分配。要使類可以相比,您必須實現operator<,或者使用自定義比較函數創建地圖來代替。

時間效率的唯一影響來自較大的物體需要較長的時間進行復制和比較。如果物體的尺寸需要達到這個尺寸,那麼你無法做到這一點,所以不要擔心。

+1

你也可以專注於'std :: less'這個類型。 – sbi 2010-08-18 21:35:21

2

只要該類具有operator<(或以其他方式使其實例< -comparable,例如,通過定義一個獨立的operator<可以接受兩個這樣的實例作爲參數,這種或那種方式 - 或者,你又進行具有顯式比較對象的地圖),它將正常工作。當且僅當該運算符或函數(以及其他重要的位像複製構造函數)是當然的。

編輯:添加的額外位是operator<(如果這是您要使用,而不是提供一個明確的比較對象是什麼)不需要操作員,但可能是一個單獨的功能 - TX到@Neil指點這在評論中。

+4

這個類沒有必要有一個操作符< - 它必須簡單地小於可比較的。這可以通過一個免費功能來實現。 – 2010-08-05 18:05:15

+0

@尼爾,優點 - 編輯修復,TX。 – 2010-08-05 21:57:37

+0

std ::地圖使用std :: less 。你也可以專注於此。 – MSalters 2010-08-06 08:19:43

1

是的,只要它實現了小於運算符<或者您在地圖定義中給出了比較特徵,則可以使用任何類作爲關鍵字。

不要擔心時間,除非它在實踐中證明是一個問題。

1

關於使用用戶定義的類的鍵,當然。由於Map定義的方式,您必須爲您的類定義一個「少於」運算符(運算符<),或者在構建地圖時給出一個比較對象。 Here是後者的一個例子。

關於效率,不要過早擔心,但是一個問題是複製關鍵對象的成本高昂。

這不是關於效率,而是避免改變鍵的內容,從而影響到他們在地圖中時的運算符<的結果。

如果你是用鑰匙的不同組成部分(因爲你說這是「多數據」,看boost::multi_index

2

要用作地圖的密鑰類型的類型要麼需要有std::less<T>專業化或其他謂詞(而不是默認的std::less)傳遞給地圖。默認實現std::less使用<。所以,你可以

  1. 超載operator<()你的類型
  2. 專門std::less
  3. 通不同的謂詞std::map
相關問題