2009-09-04 44 views
4

我是新來的STL。有關使用地圖來存儲任意對象的東西:如果我打算使用任意類對象作爲鍵,我可以使用stl映射嗎?

std::map<MyClassObj, MyDataObject> MyMap; 

是我如何找到對象。 MyMap.find(MyClassObjInstance)如何用於實例?我是否需要實現自己的迭代器並提供一些標準函數,這些函數會包含一些等價函數?任何例子,將不勝感激。

是否有另一種方法來存儲使用標準庫的任意對象的關聯列表?我已經在使用stl來維護平臺可移植性,並且不希望添加像BOOST這樣的其他庫依賴項。

回答

8

std::map在鍵和值之後有第三個模板參數,表示將使用哪個函數來比較鍵。默認情況下,它是std::less,它依次使用operator<。所以如果你的班級有一個運營商<,那沒問題,否則你可以提供你自己的比較器。

+0

哇,我的眼睛只是掠過了第三個參數!我想我習慣於用一堆我通常不關心的參數來看重載的函數文檔。謝謝! – AlanKley 2009-09-04 17:42:32

+0

:)我方便地忘了提及第四個參數 - 分配器。我從來沒有見過它使用過,但。 – xtofl 2009-09-04 18:06:05

+0

@Xtofl:我曾經不得不使用分配器,因爲XP的服務包大幅改變了釋放堆中分配的數百個整數的性能。 – Jherico 2009-09-04 21:29:15

6

你們所有人都需要爲MyClassObj定義operator<。有關std :: map的更多信息,您可以閱讀here

根據C++標準23.1.2:

短語「‘鍵的等價’」是指由上鍵的比較,而不是操作者 ==施加的等價關係。也就是說,如果用於比較,則認爲兩個密鑰k1和k2是等價的 object comp,comp(k1,k2)== false & & comp(k2,k1)== false。

默認compstd::less

根據C++標準20.3.3:

template <class T> struct less : binary_function<T,T,bool> { 
bool operator()(const T& x, const T& y) const; 
}; 

// operator() returns x < y. 

當然,你可以定義獨立的仿函數comp進行比較。

+0

這就是我所希望的答案類型,只是無法在所有文檔中找到答案。這在哪裏記錄? – AlanKley 2009-09-04 17:36:46

+1

大部分時間我都會看一下www.sgi.com/tech/stl – xtofl 2009-09-04 17:38:27

+0

Typo:'operator>'當您在第一行中指定'operator <'時。 – 2009-09-04 17:59:36

2

是的,你可以使用自己的類型/對象作爲關鍵。他們必須實現小於運算符(運算符<),因爲所有有序的標準C++容器都使用此運算符來測試排序和相等性。

3

完整類型的地圖是

template < class Key, class T, class Compare = less<Key>, 
     class Allocator = allocator<pair<const Key,T> > > class map; 

它使用小於默認值,但只要你有運營商()重載取對象的兩個實例,所有返回一個布爾值一類通很好。注意如果你給它comp(a,b)並且它返回true,那麼在排序中a應該在b之前。

相關問題