【问题标题】:C++ - std::map Alternative that doesn't require castingC++ - std::map 不需要强制转换的替代方案
【发布时间】:2013-07-28 19:24:00
【问题描述】:

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

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

std::map 有哪些替代方法,它们确实要求键对象是唯一的,但不要求将其强制转换为整数(或字符串等)?

【问题讨论】:

  • “我注意到地图将坐标转换为整数” -- 你把我弄丢了。我不知道你在说什么。您能否提供一些代码来帮助演示您的问题?
  • 要检查 Map 应该按什么顺序放置值,它执行 key1
  • 3 维整数可以轻松转换为单个整数,反之亦然,如果您愿意将整数宽度增加三倍。

标签: c++ map std


【解决方案1】:

您可以使用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 实现一个小于运算符来完成的,但您也可以定义一个函子并使用它来构造地图:

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;

【讨论】:

  • ooo 我什至没有添加比较运算符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多