2016-07-25 6 views
1

비슷한 필드가 많은 개체간에 엄격한 정렬을 어떻게 제공합니까? 여러 필드와 비교할 때 엄격한 순서 지정

는 3 개 필드 (A, B, C)

bool less(x, y) 
    return x.a < y.a || x.b < y.b || x.c < y.c 

좋은 두 객체 x과 비교해야 y 각을 가정,하지만이 약한 순서를 제공합니다. x.a < y.a 및 y.b < x.b 인 경우 less(x,y)이 참일 경우 less(y, x)도 true입니다.

나는

bool less(x, y) 
    return x.a < y.a || (x.a == y.a && x.b < y.b) 

를 작성하는 데 사용하고 있지만, 관련 분야의 수가 증가하면 매우 추한 것으로 시작합니다.

bool less(x, y) 
    return x.a < y.a || 
     (x.a == y.a && x.b < y.b) || 
     (x.a == y.a && x.b == y.b && x.c < y.c) || 
     (x.a == y.a && x.b == y.b && x.c == y.c && x.d < y.d); 

누가 더 나은 알고리즘을 갖고 있습니까?

+2

나는 당신이 무엇이 가장 중요한 분야이고, 무엇이 덜한지를 정의 할 필요가 있다고 생각한다. 주문 (나는 생각한다)은 정확하게 결정되어야한다. 기본적으로 어떤 자산을 먼저 확인합니까? 두 번째 것은 무엇이고 세 번째는 무엇입니까? –

+0

나는 그것을하고 싶지만 문제의 본질 때문에 비교 *는 각 필드를 어떤 식 으로든 고려해야한다. – UmNyobe

+2

또 다른 옵션은 3 개 (또는 4 개 또는 10 개)의 계산을 수행하는 함수를 만드는 것이다. 당신에게 하나의 값을주고 * 당신이 비교하는 속성입니다. 'val_to_compare = 1 * a + 10 * b + 23 * c'와 같은 것입니다. 이렇게하면 속성에 가중치를 첨부 할 수 있습니다. –

답변

3

C++ 11 이상을 사용하는 경우 SWO를 직접 작성하지 않고도 유용한 트릭을 얻을 수 있습니다. std::tuple을 사용하여 멤버를 팩할 수 있으며 std::tuple이 사전 식 순서로 operator<을 구현한다는 사실을 알 수 있습니다.

그래서 당신은 쓸 수있는이

struct foo { 
    int x, y, z; 

    bool operator<(const foo& rhs) const { 
     return std::tie(x, y, z) < std::tie(rhs.x, rhs.y, rhs.y); 
    } 
}; 

및 구조체 foo은 전적으로 X, Y, Z에 의해 비교됩니다. 이것은 여전히 ​​쓸 수 많은, 그래서 당신은이 당신이 회원의 많은 경우 입력을 많이 절약 할 수 있습니다

struct foo { 
    int x, y, z; 

    auto tied() const { 
     return std::tie(x, y, z); 
    } 

    bool operator<(const foo& rhs) const { 
     return tied() < rhs.tied(); 
    } 
}; 

조금을 향상시킬 수 있지만, C++ 11 C++ 14 (가정 , 손으로 tied의 반환 유형을 작성해야합니다.

2

나는 일반적으로이 작업을 수행 :

bool operator< (type x, type y) { 
    if (x.a < y.a) return true; 
    if (x.a > y.a) return false; 

    if (x.b < y.b) return true; 
    if (x.b > y.b) return false; 

    return x.c < y.c; 
} 

이 하드 순서를 제공하고 요소 당 오버 헤드를 증가하지 않고 치료 한 많은 요소를 확장합니다.