2012-12-14 4 views
1

키가 클래스 인지도에 삽입하려고합니다. 나는 아래로 내 클래스의 연산자 < 기능을 오버로드했습니다 다중 필드 클래스에 대해 연산자 <을 (를) 오버로드

struct MyType 
{ 
    int a, b, c; 
    bool operator<(const MyType& Rhs) const 
    { 
     return (a<Rhs.a) || (b<Rhs.b) || (c<Rhs.c); 
    } 
} 

그러나 특정 (독특한) 키

는, 값은 맵에 덮어 쓰기되고있다.

다중 값 키에 대해 선호 연산자 <은 무엇입니까?

튜플을 사용하는 Defining operator< for a struct을 본 적이 있지만 가능하다면 오히려 장시간 씁니다.

+2

. 이 클래스는 작성된대로'std :: map'의 키로서 사용하면 안됩니다. –

+0

@KerrekSB 엄격한 약한 주문이란 무엇입니까? – Neil

+0

[인터넷에서 발견 할 수있는] 것 (http://en.wikipedia.org/wiki/Strict_weak_ordering) :-) 또는이 웹 사이트에서 수 백개의 사본을 검색하십시오. –

답변

3

이 표현

(a<Rhs.a) || (b<Rhs.b) || (c<Rhs.c) 

엄격한 약한 순서를 생성하지 않습니다 a > Rhs.a하지만 b < Rhs.b을 가정합니다. 식은 true을 반환하지만 a이 같을 때만 false : b을 사용하여 연결을 해결해야하며 ab이 같은 경우에만 c을 사용해야합니다.

(a<Rhs.a) || 
(a==Rhs.a && b<Rhs.b) || 
(a==Rhs.a && b==Rhs.b && c<Rhs.c) 

이이 훨씬 우수한 가독성을 위해 사용하는 나는 당신을 추천 the expression suggested in Kerrek SB's answer을 작성하는 긴 방법은 다음과 같습니다

이 다음 "계단"으로 표현을 이끌고 있습니다.

+0

사용하는 부스트 버전 (1.33.1)이이를 지원하지 않는 것 같아서 장황하게 구현해야합니다. 감사 – Neil

5

대신이 작업을 수행합니다 : 당신은 #include <tuple> 필요

return std::tie(a, b, c) < std::tie(Rhs.a, Rhs.b, Rhs.c); 

.

+0

튜플을 사용하지 않을 것입니다. – Neil

+1

@Kerrek : OP가 왜 효과가 있을지 이해할 수 있도록 조금 설명해주세요. – Nawaz

+1

+1 당신의 코멘트에서 "엄격한 약한 질서"를 설명한다고 가정합니다. – dasblinkenlight

1

문제는 당신이 예를 두 MyTypeM2 = {1, 2, 1} 예를 M1 = {1, 1, 2}에 대해 말하고 싶은 경우에 당신이 불행한 상황을 가지고있다 M1 < M2M2 < M1을 그!

struct MyType 
{ 
    int a, b, c; 
    bool operator<(const MyType& Rhs) const 
    { 
     if (a < Rhs.a) return true; 
     if (a > Rhs.a) return false; 
     if (b < Rhs.b) return true; 
     if (b > Rhs.b) return false; 
     return c < Rhs.c; 
    } 
} 

(이 덜 최적의 dasblinkenlight의 대답에서 식을 작성하는 방법이 있지만, 이해하기 어쩌면 더 쉽다) : 당신이 abc 어떤 의미/순서를 할당해야이 문제를 해결하기 위해

.

하지만 이것이 필요한 이유를 알고 나면 tuple으로 전환해야합니다. 이것이 실제로 상용구 코드입니다.

0

해당 유형의 키를 매핑하고 비교를하지 않아도해야하는 경우 부스트 :: unordered_map도를 사용하고 부스트 :: hash_combine를 사용하여 유형 심부름 군을 정의 할 수 있습니다 주문 엄격한 약한 순서없는