2012-05-21 4 views
1

나는 모든 비교 연산자를 오버로드하는 클래스가 있습니다. 나는이 객체들의 묶음을 키로지도에 적재하고지도가 가장 큰 것부터 가장 큰 것까지 정렬 할 것으로 기대한다.C++ std :: map 키 정렬 비교 함수?

그러나지도는 실제로 가장 큰 것부터 가장 작은 것까지 정렬됩니다. 왜 이런거야? 지도를 정렬 할 때 키에 비교 연산자를 사용하지 않습니까? 어떻게해야할까요?

+7

코드를 게시하십시오. 코드를 보지 않고 대답 할 수 없습니다. –

+0

'std :: map'은 기본적으로'operator <'를 사용합니다. 'operator <'의 구현이 거꾸로되어 있지 않습니까? – jamesdlin

+0

주문을 어떻게 점검하고 있습니까? 예상 된 주문을 손으로 확인할 수 있습니까? 예 : 'cout << obj1 << ""<< obj2 << "는"<< boolalpha << (obj1

답변

2

당신이 표준 : :지도에 대한 정의를 보면은, 3 매개 변수는 비교입니다 - 기본적으로 std::less< Key >을. 기본 구현은 operator<을 호출하는 것입니다.

당신은 YourType은과 같이, 정의 된 헤더에 새 버전을 정의하는 시도 할 수 :

template<> std::less<YourType> 
{ 
    bool operator()(
     const YourType& lhs, 
     const YourType& rhs) 
    { 
     if(!(lhs.member1 < rhs.member1)) 
     { 
      return false; 
     } 

     if(!(lhs.member2 < rhs.member2)) 
     { 
      return false; 
     } 

     return true; 
    } 
} 

이 수업 시간에 친구 std::less< YourType >해야합니다.

실제 테스트는 다음을 준수해야합니다 또는 당신이 모든 문제의 종류 얻을 것이다 : = false를

  • 좌 < 좌를 거짓 RHA < 좌를
  • 사실

    • 좌 < 우를 =

    (나는 최근에 발견 한) 중요한 점은 컴파일러가 당신이 의미를 재정의했다는 불평을하기 시작하면 std::less 또는 다른 펑키 물건 일 경우 사용자가 std::map< YourType >을 신고했을 때 전달한 사람이 YourType 인 것으로 나타났습니다.

    희망이 도움이됩니다.

  • 0
    당신은 비교 연산자의 오버로드를 구현하는 코드를 작성해야한다, 그래서 추측을 기반으로 대답 할 수

    :

    bool operator < (T lhs, T rhs) const 
    { 
        return rhs < lhs; // note: lhs is on the right! 
    } 
    

    귀하의 문제는 단순한 오타 일 수 (나는 한 번 그했다) 실제로 당신이 원하는 :

    bool operator < (T lhs, T rhs) const 
    { 
        return lhs < rhs; 
    }