我是STL的新手。关于使用地图存储任意对象的事情让我感到困惑:
std::map<MyClassObj, MyDataObject> MyMap;
是我如何找到对象。 MyMap.find(MyClassObjInstance)如何工作?我是否需要实现自己的迭代器并提供一些标准函数,其中包括一些等价函数?任何例子都将不胜感激。
是否有另一种方法可以使用标准库存储任意对象的关联列表?我已经在使用stl来维护平台的可移植性,并且不希望像BOOST一样添加另一个库依赖项。
答案 0 :(得分:9)
std::map
在键和值之后有第三个模板参数,表示将用于比较键的函数。默认情况下,它是std::less
,然后使用operator<
。因此,如果你的班级有一个运算符&lt;,没关系,否则你可以提供自己的比较器。
答案 1 :(得分:7)
您需要的是为operator<
定义MyClassObj
。有关std :: map的更多信息,请阅读here。
根据C ++标准23.1.2:
短语“等价键”是指比较所强加的等价关系,而不是 operator == on key。也就是说,如果用于比较,则认为两个键k1和k2是等效的 object comp,comp(k1,k2)== false&amp;&amp; comp(k2,k1)== false。
默认情况下,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.
当然,您可以定义独立仿函数comp
进行比较。
答案 2 :(得分:3)
地图的完整类型是
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之前。
答案 3 :(得分:2)
是的,您可以使用自己的类型/对象作为键。他们必须实现小于运算符(运算符&lt;),因为所有有序的标准C ++容器都使用此运算符来测试排序和相等。