我有两个向量A和B(带有x
,y
和z
坐标),我想知道A % B
是否是有效的操作我在某处读到/
操作对两个向量无效,并且因为%
涉及除法因此导致混淆。如果%
有效,那么如何重载%
中的C++
运算符来执行操作。
这是我的矢量类:
class Vec {
public:
float x, y, z;
};
答案 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不是有效的标准化操作。
但您可以自由创建这样的自定义操作来表示您需要的任何内容。在这种情况下,您必须重载运算符%以完全按照您的意愿执行。