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

Ala*_*ley 5 c++ associative-array stl

我是STL的新手.关于使用地图存储任意对象的事情让我很难过:

std::map<MyClassObj, MyDataObject> MyMap;
Run Code Online (Sandbox Code Playgroud)

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

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

xto*_*ofl 9

std::map在键和值之后有第三个模板参数,表示将用于比较键的函数.默认情况下,它是std::less,它反过来使用operator<.因此,如果你的班级有一个操作员<,没关系,否则你可以提供自己的比较器.


Kir*_*sky 7

所有你需要的是明确operator<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.
Run Code Online (Sandbox Code Playgroud)

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