2014-01-10 2 views
0

나는 C++ STL의 SORT에 대한 사용자 지정 비교 함수?

 typedef pair < long , pair <bool ,long > > t; 
     vector <t> time ; 

를 사용하고 난 표준을 사용하여 : : 정렬() 함수를 위의 벡터를 정렬 할 필요가 있지만에게 사용자 정의 비교 함수를 사용하여. 나는 그것의 버전을 썼지 만 제대로 작동하지 않습니다. 제 실수를 지적 해 주시겠습니까?

  bool comp (const t &a , const t &b){ 

     if (a.first < b.first) 
     return a.first > b.first ; 
     else if (b.first < a.first) 
     return b.first > a.first ; 
     else if (a.first == b.first) 
     { 
       if (a.second.first == false && b.second.first == true) 
       return a.first > b.first ; 
      else if (a.second.first == true && b.second.first == false) 
      return b.first > a.first ; 
      else 
      return a.first > b.first ; 
     } 
     } 


     inside main(){ 
     sort (time.begin() ,time.end() ,comp) ; 
     } 

사용자 정의 케이스 : 사전에

 Before sorting : vector time 
     10 1 1 
     100 0 1 
     100 1 2 
     200 0 2 
     150 1 2 
     500 0 2 
     200 1 2 
     300 0 2 
     After Sorting : 
     10 1 1 
     100 0 1 
     100 1 2 
     150 1 2 
     200 0 2 
     200 1 2 
     300 0 2 
     500 0 2 

감사합니다.

+0

이 질문은 이러한 것들을 어떻게 정렬해야하는지에 대한 영어 설명을 사용할 수 있습니다. 즉, 하나의 "t"를 다른 것보다 "덜"만드는 것입니다. 이 코드는이 문제에 대해 다소 혼란스러워 보입니다. – cHao

+0

코드를 올바르게 들여 씁니다. 현재 읽을 수 없습니다. –

답변

1

비교 기능은 순서를 정의하지 않습니다. 사실 언제든지 a.first != b.first을 반환하는 것으로 보입니다.

어떤 맞춤 주문을 원하는지 잘 모르겠습니다. 표준 : : 쌍 표준 순서는 같은 발생합니다 :

가 사용하는 유일한 비교 운영자가 < 때문에 그것은, 실제로는 조금 더 복잡
bool 
comp(t const& a, t const& b) 
{ 
    if (a.first != b.first) 
     return a.first < b.first; 
    else if (a.second.first != b.second.first) 
     return a.second.first < b.second.first; 
    else 
     return a.second.second < b.second.second; 
} 

. 그러나 <!=이 모두 이고 정상적으로 작동하는 경우 결과는 위의 과 동일합니다.

당신은 어떤 요소 가든 주문을 쉽게 비교할 수 있습니다. 요소 중 하나의 순서를 반대로하려면 <>으로 바꿉니다.

마지막으로 false은 부울 값의 경우 true보다 작습니다.

+0

나는 a.first! = b.first에 대해 false를 반환한다고 말할 수 있습니다. –

+0

@KitFisto 더 자세히 살펴보면 항상 false를 반환한다고 말하고 싶습니다. 'a.first == b.first'의 경우, 모든 반환 경로는'a.first> b.first' 또는'b.first> a.first' 중 하나입니다. (나는 아직도 그가하려고하는 것을 이해할 수 없다.) –

3

이 있어야한다 : 버전에서

if (a.first < b.first) 
    return true 
else if (b.first < a.first) 
    return false; 
// etc. 

이 두 경우에 false를 돌려줍니다.

+1

명확히하기 :'a.first '가 이상하게 정의되어 있지 않으면'a.first> b.first'가 거짓 (또는 그 반대)이됩니다. – cHao