簡體   English   中英

實現operator <for x,y,z坐標

[英]Implementing operator< for x,y,z coordinate

我有這種類型,基本上是一個

struct { int x,y,z; } 

我想用作st​​l地圖的關鍵字。 由於它是一個自定義類型,我需要實現運算符<為地圖做比較魔術。

我很難找到允許它的功能。 到目前為止,我已經嘗試過:

return X < v.X && Y < v.Y && Z < v.Z;

這根本不起作用,而且

return X*X+Y*Y+Z*Z < v.X*v.X+v.Y*v.Y+v.Z*v.Z;

給出這個形狀而不是正方形:

在此輸入圖像描述

請記住,x,y或z值可能為負值,這會進一步使后續解決方案無效。

任何人都知道如何實現這樣的功能?

我假設您只需要任何穩定的訂單,這樣訂購的容器就可以運行。

if ( X != v.X ) return X < v.X;
if ( Y != v.Y ) return Y < v.Y;
return Z < v.Z; 

這是做什么的:除非X是相同的,否則你是根據X訂購的,如果是,你在Y上訂購等等。

不需要 operator< ,並且在運營商的語義對於在同一域中工作的所有人來說不自然以避免混淆的情況下,您不應該實現它。 其他人可能對不太重要的東西有不同的解釋,將兩個點與提供的operator<進行比較operator<並與結果混淆。

您最好為特定地圖提供比較運算符:

struct compareXYZ : std::binary_function<Point,Point,bool> {
   bool operator()( Point const & l, Point const & r ) const {
      return l.x < r.x 
          || (l.x == r.x) && (l.y < r.y)
          || (l.x == r.x) && (l.y == r.y) && l.z < r.z;
   }
};
std::map< Point, Value, compareXYZ> theMap;     // uses XYZ comparison

這樣,對於地圖的用戶來說,如何在容器中對點進行排序(比如用於線性迭代)以及缺少operator<將比產生隨機結果的運算符的存在更不令人驚訝。

可以使用矢量的長度來比較三維矢量

SquareRoot(X*X + Y*Y + Z*Z);

這允許負方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM