[英]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是等效的。
默認情況下, comp
是std::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.