【问题标题】:Overloading operator < relational C++重载运算符 < 关系 C++
【发布时间】:2018-05-30 03:03:22
【问题描述】:

我试图回答这个问题但我不能。你能帮帮我吗。Vector3Ds 是一个类,它在一个数组中接受像 x,y,z 这样的 3d 数学向量:

问题: 假设您希望能够将 Vector3D 存储在 STL 集中。您将此任务委托给一个朋友,他返回以下操作符 <:> 的实现

 bool Vector3D::operator< (const Vector3D& other) const
{
for(int k = 0; k < NUM_COORDINATES; ++k)
if(coordinates[k] < other.coordinates[k]) return true;
return false;
}

如果 Vector3D 存储在 STL 集或地图中,则运算符

Vector3D.h

class Vector3D
{
public:

Vector3D();

void set(int arrayIndex,int num);

bool operator< (const Vector3D& other) const;

private:

static const int NUM_COORDINATES = 3;
double coordinates[NUM_COORDINATES];
};



Vector3D.cpp

#include "Vector3D.h"

Vector3D::Vector3D(void){

}


 void Vector3D::set(int arrayIndex,int num){

coordinates[arrayIndex]=num;



}
 bool Vector3D::operator< (const Vector3D& other) const
 {
for(int k = 0; k < NUM_COORDINATES; ++k)
if(coordinates[k] < other.coordinates[k]) return true;
return false;
 }

【问题讨论】:

  • 如果您测试了代码并且没有遇到问题,那么您的测试不是很好。根据您对operator&lt; 的定义,您需要插入严格弱irder 的条件不成立的值。哪些值会导致问题完全取决于您使用对象的类/函数。
  • 计算向量的长度并在比较中使用它,而不是比较坐标。

标签: c++ operator-overloading operator-keyword


【解决方案1】:

operator&lt; 的实现不满足strictly weak ordering 的要求。

我们分两点:

p1 = [1, 2, 0] 和
p2 = [2, 1, 0]。

根据您的实现,p1 和 p2

一种解决方案是使用:

bool Vector3D::operator<(const Vector3D& other) const
{
   for(int k = 0; k < NUM_COORDINATES; ++k)
   {
      if(coordinates[k] != other.coordinates[k])
      {
         return (coordinates[k] < other.coordinates[k]);
      }
   }
   return false;
}

【讨论】:

  • 我知道问题代码中缺少这一位 if(coordinates[k] != other.coordinates[k])。
  • 但是为什么当我使用上面没有 if(coordinates[k] != other.coordinates[k]) 的代码时没有错误。
  • @TikaGurung,通过该检查,p1
  • 你能再解释一下吗?我还是很困惑。
  • @TikaGurung,创建两个对象。 Vector3D p1, p2;。将它们的坐标分别设置为 [1, 2, 0] 和 [2, 1, 0]。现在,使用std::cout &lt;&lt; std::boolalpha &lt;&lt; (p1 &lt; p2) &lt;&lt; " " &lt;&lt; (p2 &lt; p2) &lt;&lt; std::endl;。尝试使用您的原始功能,然后使用我的建议。输出有意义吗?这是否有助于您理解为什么您的实施存在问题以及为什么我的建议不存在问题?
猜你喜欢
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多