2016-09-13 4 views
0

저는 C++지도 컨테이너에서 3D 벡터를 키로 사용하고 있습니다. 두 벡터의 비교를 구현해야합니다. 벡터를 비교하기 위해 크기를 사용했습니다. 그러나 두 벡터가 다르지만 크기가 같을 때 문제가 발생하여 C++ 맵 컨테이너에서 키를 덮어 쓰게됩니다.두 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

'벡터 3f'란 무엇입니까? 회원들은 어떤 회원입니까? – NathanOliver

+3

흠, 좌표를 비교 하시겠습니까? 'std :: tie'는 엄격한 약한 순서를 깨지 않도록 도와줍니다. – LogicStuff

+0

x, y, z 축에서 비교해 보시지 않겠습니까? (예를 들면) – Zouch

답변

2

단순히 magnitude을 비교하는 대신 comparison operators이 사전 식으로 정의 된 std::tuple을 사용하여 비교할 수 있습니다.

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<