2016-09-13 15 views
0

私は3DベクトルをC++マップコンテナのキーとして使用しています。そのためには、2つのベクトルの比較を実装する必要があります。ベクトルを比較するために大きさを使用しました。しかし、2つのベクトルが異なるが、その大きさが同じで、C++マップコンテナのキーを上書きするという問題が発生します。2つの3Dベクトルを比較する

小さな実装を見つけることができます。

class Vector3f 
{ 
public: 
    float x, y, z; 
    double magnitude() const { return sqrt(x*x + y*y + z*z); } 
} 
std::map<Vector3f, std::vector<int>, Vector3fCompare> vector_index; 

struct Vector3fCompare 
{ 
    bool operator() (const Vector3f& lhs, const Vector3f& rhs) const 
    { 
     return lhs.magnitude() < rhs.magnitude(); 
    } 
}; 

2つのベクトルを比較する方法はありますか?

+2

「Vector3f」とは何ですか?メンバーにはどのようなものがありますか? – NathanOliver

+3

Ehm、座標を比較しますか? 'std :: tie'は厳密な弱い順序を破らないように助けます。 – LogicStuff

+0

x、y、z軸で比較するのはなぜですか? (例えば) – Zouch

答えて

2

単にmagnitudeを比較するのではなく、を使用して比較を行うことができます。comparison operatorsは辞書編集的に定義されています。

struct Vector3fCompare 
{ 
    bool operator() (const Vector3f& lhs, const Vector3f& rhs) const 
    { 
     return std::make_tuple(lhs.x, lhs.y, lhs.z) < std::make_tuple(rhs.x, rhs.y, rhs.z); 
    } 
}; 

はまた、あなたがあなたのクラスでoperator<を定義した場合、その後、あなたはmapのテンプレート引数はあなたが定義されているので

template< 
    class Key, 
    class T, 
    class Compare = std::less<Key>, 
    class Allocator = std::allocator<std::pair<const Key, T> > 
> class map; 

だからstd::lessが定義されているように、この構造体を作成する必要はありませんのでご注意しますoperator<

関連する問題