如果我计划使用任意类对象作为键,我可以使用stl映射吗?

时间:2009-09-04 17:30:44

标签: c++ stl associative-array

我是STL的新手。关于使用地图存储任意对象的事情让我感到困惑:

std::map<MyClassObj, MyDataObject> MyMap;

是我如何找到对象。 MyMap.find(MyClassObjInstance)如何工作?我是否需要实现自己的迭代器并提供一些标准函数,其中包括一些等价函数?任何例子都将不胜感激。

是否有另一种方法可以使用标准库存储任意对象的关联列表?我已经在使用stl来维护平台的可移植性,并且不希望像BOOST一样添加另一个库依赖项。

4 个答案:

答案 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。

默认情况下,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进行比较。

答案 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 ++容器都使用此运算符来测试排序和相等。