我将3D向量用作C ++地图容器中的键,为此我必须实现两个向量的比较。我用幅度来比较向量。但是,当两个向量不同但其大小相同时,就会出现问题,这会导致C ++映射容器中的键被覆盖。
您会发现实施的小片段。
class Vector3f
{
public:
float x, y, z;
double magnitude() const { return sqrt(x*x + y*y + z*z); }
}
std::map<Vector3f, std::vector<int>, Vector3fCompare> vector_index;
struct Vector3fCompare
{
bool operator() (const Vector3f& lhs, const Vector3f& rhs) const
{
return lhs.magnitude() < rhs.magnitude();
}
};
有什么方法可以比较两个向量吗?
最佳答案
与其简单地比较它们的magnitude
,还可以使用在字典上定义了comparison operators的std::tuple
进行比较。
struct Vector3fCompare
{
bool operator() (const Vector3f& lhs, const Vector3f& rhs) const
{
return std::make_tuple(lhs.x, lhs.y, lhs.z) < std::make_tuple(rhs.x, rhs.y, rhs.z);
}
};
还要注意,如果您在类中定义
operator<
,则无需创建此结构,因为map
的模板参数是template<
class Key,
class T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T> >
> class map;
因此,由于您定义了
std::less
,因此将定义operator<