【发布时间】:2013-06-19 19:37:16
【问题描述】:
我有一个程序,我出于某种目的在其中编写了自定义类。我需要以map 之类的数据结构的形式存储类,我可以在其中轻松获取与另一个对应的项目。例如:
class Rectangle{
//...
};
class ShapeContainer{
//...};
class WarpedRectangle{
//...
};
class Adorner{
//...
};
以上是三个不同的类,在我的程序中,我尝试做如下事情:(以map为例,因为它是最接近的)
映射_输入输出映射;
地图_inputWarpedMap;
地图_adornerWarpedMap;
操作 1:
_inputOutputMap[inputRectangle1] = &shapeContainer1;
操作 2:
_inputWarpedMap[inputRectangle1] = &warpedRectangle1;
操作 3:
返回 _inputWarpedMap[inputRectangle1]
操作 4:
_adornerWarpedMap[adorner1] = &warpedRectangle1;
操作 5:
返回 _adornerWarpedMap[adorner1]
请注意,使用map 的目的不是为了获得任何排序顺序、比较等,而只是为了保持各种项目之间的对应关系[对于此输入,即输出等]。如果我尝试继续使用地图本身,我会在编译期间在 stl_function.h(函数:struct less : public binary_function<_Tp, _Tp, bool>)的某处出现错误并突出显示消息:
二进制表达式的操作数无效(const Adorner 和const Adorner) 等
如何根据我的要求获得这种类型的对应和查找属性?
【问题讨论】:
-
您是否为
Adorner等定义了比较操作? -
@n.m. : 我们如何定义形状类的相等操作?
-
@n.m.有些形状不是我定义的。这些是框架中直接使用的类。
-
你在问我吗?
std::map要求您的键是 ordered (即不仅是相等,还有小于操作)。编译器告诉您它无法比较两个Adorner对象。它需要,因为这就是std::map的工作方式。如果无法进行比较,则不能使用std::map。 -
正如答案所说,使用
unordered_map,您可以不用小于,但您仍然需要平等。但我怀疑你可能真的想要别的东西。如果您无法比较两个形状是否相等,但您不知何故知道形状 X 应该由形状 Y 而不是形状 Z 索引,这可能表明您使用的是 pointer identity 而不是 value身份,因此您在地图中的键应该是指向Adorner等的指针。这只是一个猜测,可能正确与否。