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

C++ %C+中两个向量的运算+;,c++,operator-overloading,modulus,C++,Operator Overloading,Modulus,我有两个向量A和B(带有x,y和z坐标),我想知道A%B是否是一个有效的运算,因为我在某处读到/运算对两个向量无效,而且%涉及除法,因此会产生混淆。如果%有效,那么如何在C++中重载%运算符来执行该操作 这是我的向量类: class Vec { public: float x, y, z; }; 这取决于“有效操作”的含义。标准库没有为std::vectors定义%操作,但您可以为此自由定义自己的运算符重载。这不是一个特别好的主意

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

这是我的向量类:

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

这取决于“有效操作”的含义。标准库没有为
std::vector
s定义
%
操作,但您可以为此自由定义自己的运算符重载。这不是一个特别好的主意-如果每个库都决定这样做,那么操作员的使用可能会发生冲突(即在某些上下文中是不明确的)-但在实践中,您可能会侥幸逃脱。对于更结构化的方法,考虑创建自己的类运动NIFTY运算符,而不是修改<代码> STD::vector < /COD>:< /P>的行为。 重载的基本原理是:

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;
}
对于C++03,可以添加一个构造函数
Vec(float ax,float ay,float az):x(ax),y(ay),z(az){}
并在另一个操作符
中返回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。。。我不知道在你的问题域中什么是有意义的。

如果你说的是一个向量,在3D空间中表示一个位置或一个方向,我的意思是,一个具有x,y,z坐标的向量,那么a%B不是一个有效的标准化操作


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

您自己是否实现了vector类?如果是的话,那么您只需了解操作符重载是如何完成的。如果没有,则创建您自己的类并从
std::vector
(或您正在使用的vector的任何实现)继承,并为该类编写您自己的%运算符。
x/y
的值是多少?元素除法?@molbdnilo我在某处读到向量的除法不是有效的运算,所以我不确定x/y是什么。我的目的是想知道,如果我有两个自定义向量,每个向量中都有x、y、z分量,那么如何做
vector1
%
vector2
@user2966197如果你不能分割两个向量,那么当你分割两个向量(即
%
)时,你希望剩下的向量是什么?你打算用这个操作干什么?@user2966197我几乎可以肯定它的意思不是模数。询问您的教授和/或阅读相关文本以了解内容。只有预定义的运算符可以重载,因此对于完全不相关的操作(例如向量的叉积或点积)重用/滥用它们并不少见。您能否提供如何重载%运算符,即在重载函数中写入什么。我在这方面是新手,因此没有太多的经验idea@user2966197我不确定您希望它如何工作,但我已经包括了一个示例。
东西是一个三元运算符,它检查
rhs[i]
是否为非零,如果为非零,则执行mod操作,否则将
0
放入结果中。如果你确定你的第二个向量没有0,那么你可以简化它。这将返回一个与较小输入具有相同元素数的向量。我有一个向量类,包含x,y,z公共成员变量,它们构成向量的x,y,z分量。所以我得到的每个向量都是该类类型的,而不是
std::vector
。那么,我如何为一个自定义类调整它(上面的示例),我已经展示了它的代码class@zoska我在上面的帖子中提供了vector类
    Vec result;
    result.x = lhs.x % rhs.x;
    result.y = lhs.y % rhs.y;
    result.z = lhs.z % rhs.z;
    return result;