4

私は基本的にこのタイプを持っています

struct { int x,y,z; } 

stl マップのキーとして使用したい。これはカスタム タイプであるため、map が比較マジックを実行するために operator< を実装する必要があります。

それを可能にする機能を手に入れるのに苦労しています。これまでのところ、私は試しました:

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 の値が負になる可能性があることに注意してください。これにより、後のソリューションがさらに無効になります。

そのような機能を実装する方法を知っている人はいますか?

4

3 に答える 3

10

注文されたコンテナが機能するように、安定した注文が必要だと思います。

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

これが何をするか: X が等しい場合を除き、X に基づいて注文し、等しい場合は Y に注文します。

于 2012-06-24T22:42:19.590 に答える
7

は必要あり ませんoperator<。同じドメインで作業するすべての人にとって演算子のセマンティクスが自然ではない場合は、混乱を避けるために実装しないでください。他の誰かがlessの意味について異なる解釈をしているかもしれません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<結果を生成する演算子の存在よりも、 の欠如はそれほど驚くことではありません。

于 2012-06-24T23:44:12.147 に答える
1

3 次元ベクトルは、ベクトルの長さを使用して比較できます。

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

これにより、負の方向が可能になります。

于 2012-06-24T22:42:49.873 に答える