【问题标题】:Store and retrieve corresponding items存储和检索相应的项目
【发布时间】: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 等的指针。这只是一个猜测,可能正确与否。

标签: c++ algorithm map


【解决方案1】:

您是否尝试过使用std::unordered_map?无论如何,这个用例应该比std::map 快。

(请注意,您仍然需要确保关键对象支持相等比较才能使其工作,或者您需要提供执行相同操作的外部谓词函数。

【讨论】:

  • @mwigdahi:例如,我不确定我们如何为形状类定义相等操作。你能放点光吗?
  • 嗯,您将它们用作映射中的键,这意味着您需要有某种方法来指示一个键与另一个键相同,因此需要进行相等性测试。您将为该类定义一个 operator == () 并比较定义您的形状对象的任何内部状态,如果内部状态匹配您返回 true。
  • 而且有些形状不是我定义的。这些是框架中直接使用的类。例如,在整个代码中的许多地方都使用了 Rectangle,即使以某种方式为 Rectangle 添加了相等运算符,代码中的其他地方也没有任何意义。有出路吗?
  • 例如,如果你想比较两个矩形,你会查看它们的原点、长度和宽度,如果它们相同,你会返回 true。如果矩形还具有与比较相关的属性(例如颜色),则还应包括一个检查以确保颜色匹配。具体细节由您的实施决定。
  • 您不需要直接修改类——unordered_map 允许您指定一个关键类外部的比较谓词函数。在此处检查签名:cplusplus.com/reference/unordered_map/unordered_map
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2015-11-27
相关资源
最近更新 更多