5

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

std::map<MyClassObj, MyDataObject> MyMap;

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

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

4

4 回答 4

9

std::map在 key 和 value 之后有第三个模板参数,表示将使用什么函数来比较键。默认情况下,它是std::less,而它又使用operator<. 所以如果你的类有一个operator<,没关系,否则你可以提供一个自己的比较器。

于 2009-09-04T17:37:50.967 回答
7

您所需要的只是定义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.

当然,您可以定义独立的仿函数comp进行比较。

于 2009-09-04T17:34:51.190 回答
3

地图的完整类型是

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

它默认使用小于,但只要您传入一个重载了 operator () 的类以获取对象的两个实例并返回一个 bool,一切都很好。请注意,如果您给它 comp(a,b) 并且它返回 true,那么 a 应该在排序中位于 b 之前。

于 2009-09-04T17:38:57.250 回答
2

是的,您可以使用自己的类型/对象作为键。他们必须实现小于运算符 (operator<),因为所有有序的标准 C++ 容器都使用该运算符来测试顺序和相等性。

于 2009-09-04T17:36:33.730 回答