2010-02-24 5 views
6

다음 코드를 수정 너무 가장 우아한 방법이 될 것입니다 무엇 나는     당신이 그것을 어떻게해야되지 않습니다, 알고있다.)을 또 다른 확실한 해결책 미만 <를위한 정의하는

namespace std { 
    bool operator< (area_t const& a, area_t const& b) { 
     return(a->first < b->first); 
    }; 
}; 

pair < int, area_t>하지만 피하고 싶습니다. 은 정의되지 않은 한 쌍의 요소 에 대해서만 연산자를 정의 할 수 있습니다.

+4

재미있는 이름은 여기에 있습니다.) –

+0

이름이 뭔가요? 다른 이름의 장미는 단맛으로 냄새가났다. –

답변

6

일부 특정 및/또는 매우 이국적인 비교 방법을 구현하는 비교기를 구현할 때는 해당 목적으로 operator <을 하이재킹하는 대신 명명 된 함수 또는 함수 개체를 사용하는 것이 좋습니다. std::pair 객체를 비교하는 자연스러운 방법은 사전 비교를 사용하는 것입니다. 비교가 사전식이 아니기 때문에 operator <을 대신하는 것이 좋습니다. 더 나은 비교기 클래스를

typedef pair< int, area_t > Pair; // give it a more meaningful name 

struct CompareFirstThroughSecond { 
    bool operator()(const Pair& p1, const Pair& p2) const { 
    if (p1.first != p2.first) return p1.first < p2.first; 
    return p1.second->first < p2.second->first; 
    } 
}; 

를 구현하고 컨테이너

std::set< Pair, CompareFirstThroughSecond > queue; 

(내가 제대로 원래의 코드에서 사용자의 의도를 해독 희망)와 함께 사용.

또한 위의 operator() 메서드를 템플릿 메서드로 구현할 수 있으므로 반복자가 second 인 모든 std::pair 기반 형식에서 사용할 수 있습니다. 당신의 비교가 "이국적인"정도로 충분하기 때문에 그것은 이해할 수 없습니다.

+1

'std :: pair'는 이미'operator <'를 구현하고 OP는 두 번째 멤버 (iterator)를 위해 비교자를 어떻게 연결하는지 궁금합니다. – UncleBens

+0

@UncleBens : 오, 알겠습니다. 당신 말이 맞아요. 그래도 내가 제안한 것은 효과가있다. 또한 연산자 오버로딩을 통해 반복자 유형에 대한 비교자를 구현하려는 시도는 위험한 시도입니다. 일반적으로 반복자는 내장 유형 (연산자 오버로딩이 불가능한 경우)으로 구현 될 수 있기 때문입니다. – AnT

+1

@UncleBens - 그걸 넣는 훌륭한 방법입니다. 쌍의 두 번째 요소에 대해 연산자를 _plug-in_ 지정하려고합니다. @AndreyT - 먼저 쌍의 int를 비교해야하며, 같으면 그 쌍의 'area_t'멤버를 비교해야합니다. 그게 효과가있다. 하지만 그것은 정확하게 피하려고했는데,'연산자 <'는'std :: pair'와 int를 위해 이미 구현되어 있습니다. 나는 바퀴를 재발 명하고 싶지 않다. (덧붙여서 그것은 굉장히 많은 타이핑입니다.) –