簡體   English   中英

如果我計划使用任意類對象作為鍵,我可以使用stl映射嗎?

[英]Can I use an stl map if I plan to use arbitrary class objects as the key?

我是STL的新手。 關於使用地圖存儲任意對象的事情讓我很難過:

std::map<MyClassObj, MyDataObject> MyMap;

是我如何找到對象。 MyMap.find(MyClassObjInstance)如何工作? 我是否需要實現自己的迭代器並提供一些標准函數,其中包括一些等價函數? 任何例子將不勝感激。

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

std::map在鍵和值之后有第三個模板參數,表示將用於比較鍵的函數。 默認情況下,它是std::less ,它依次使用operator< 因此,如果你的班級有一個操作員<,沒關系,否則你可以提供自己的比較器。

所有你需要的是定義operator< for MyClassObj 有關std :: map的更多信息,請參閱此處

根據C ++標准23.1.2:

短語“等價鍵”是指比較所強加的等價關系,而不是操作符= =鍵。 也就是說,如果對於比較對象comp,comp(k1,k2)== false && comp(k2,k1)== false,則認為兩個鍵k1和k2是等效的。

默認情況下, 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. 

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

地圖的完整類型是

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

它使用少於默認值,但只要你傳入一個運算符()重載的類來獲取對象的兩個實例並返回一個bool一切都很好。 請注意,如果你給它comp(a,b)並且它返回true,那么a應該在排序中的b之前。

是的,您可以使用自己的類型/對象作為鍵。 他們必須實現less-than運算符(operator <),因為所有有序的標准C ++容器都使用此運算符來測試排序和相等性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM