比较两个3D矢量

时间:2016-09-13 13:11:57

标签: c++ stl linear-algebra

我使用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();
    }
};

有没有办法比较两个载体?

1 个答案:

答案 0 :(得分:2)

您可以使用按字典顺序定义comparison operatorsmagnitude进行比较,而不是简单地比较他们的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<