C ++中两个向量的%运算

时间:2014-12-02 08:28:42

标签: c++ operator-overloading modulus

我有两个向量A和B(带有xyz坐标),我想知道A % B是否是有效的操作我在某处读到/操作对两个向量无效,并且因为%涉及除法因此导致混淆。如果%有效,那么如何重载%中的C++运算符来执行操作。

这是我的矢量类:

class Vec {       
  public:
  float x, y, z;                 
    };

2 个答案:

答案 0 :(得分:1)

这取决于你的意思"有效的操作"。标准库为%定义了没有std::vector操作,但您可以自由定义自己的运算符重载。这不是一个特别好的主意 - 如果每个图书馆决定这样做,那么操作员使用可能会发生冲突(即在某些情况下是模棱两可的) - 但实际上你可能会侥幸逃脱。对于更结构化的方法,考虑创建自己的类运动漂亮的运算符,而不是修改std::vector的行为。

重载的基础知识只是:

template <typename T>
std::vector<T> operator%(const std::vector<T>& lhs, const std::vector<T>& rhs)
{
     // generate and return your vector, for example...
     std::vector<T> result;
     for (size_t i = 0; i < std::min(lhs.size(), rhs.size()); ++i)
          result.push_back(rhs[i] ? lhs[i] % rhs[i] : 0);
     return result;
}

更新 - 给定您自己的Vec类(并假设您有一个C ++ 11编译器/ - 您可以搜索如何单独启用C ++ 11功能)。

Vec operator%(const Vec& lhs, const Vec& rhs)
{
    return { lhs.x % rhs.x, lhs.y % rhs.y, lhs.z % rhs.z };
}

对于C ++ 03,可以在运算符Vec(float ax, float ay, float az) : x(ax), y(ay), z(az) { }中添加构造函数return Vec(lhs.x % rhs.x, lhs.y % rhs.y, lhs.z % rhs.z);,也可以在没有构造函数的情况下添加...

    Vec result;
    result.x = lhs.x % rhs.x;
    result.y = lhs.y % rhs.y;
    result.z = lhs.z % rhs.z;
    return result;

当然,上面的实现只是假设你想在相应的索引元素上使用mod ...我不知道你的问题域中有什么意义。

答案 1 :(得分:0)

如果你说的是在3D空间中表示位置或方向的意义上的向量,我的意思是,带有x,y,z坐标的向量,则A%B不是有效的标准化操作。

但您可以自由创建这样的自定义操作来表示您需要的任何内容。在这种情况下,您必须重载运算符%以完全按照您的意愿执行。