C ++ - std :: map不需要强制转换的替代方法

时间:2013-07-28 19:24:01

标签: c++ map std

我使用std :: map来存储某些对象。地图包含模板<Coordinate, Object>。现在,我注意到的是地图将Coordinate转换为整数,然后基于它为元素提供唯一键。 (等于那个整数)

现在,问题在于不可能将3维整数(x,y,z)转换为std :: map可以使用的单个整数。

std :: map有哪些替代方法确实需要密钥对象是唯一的,但不要求它被转换为整数(或字符串等)?

1 个答案:

答案 0 :(得分:2)

您可以使用Coordinate作为地图的关键字。你只需要为它定义strict weak ordering(类似于小于或大于比较的东西)。你如何做到这一点取决于你,但你可以使用3坐标进行词典比较:

#include <tuple> // for std::tie

struct Coordinate
{
  double x, y, z;
  ....

  bool operator<(const Coordinate& rhs) const
  {
    return std::tie(x, y, z) < std::tie(rhs.x, rhs.y, rhs.z);
  }
};

这里,这是通过实现Coordinate的les-than运算符来完成的,但您也可以定义一个仿函数并使用它来构造映射:

struct Comp
{
  bool operator()(const Coordinate& lhs, const Coordinate& rhs) const
  {
    return std::tie(lhs.x, lhs.y, lhs.z) < std::tie(rhs.x, rhs.y, rhs.z);
  }
};

然后

std::map<Coordinate, ValueType, Comp> m;