我使用std :: map来存储某些对象。地图包含模板<Coordinate, Object>
。现在,我注意到的是地图将Coordinate转换为整数,然后基于它为元素提供唯一键。 (等于那个整数)
现在,问题在于不可能将3维整数(x,y,z)转换为std :: map可以使用的单个整数。
std :: map有哪些替代方法确实需要密钥对象是唯一的,但不要求它被转换为整数(或字符串等)?
答案 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;