2009-06-29 4 views
2

이것은 코드입니다 :C++ 표준 : 설정 비교기

struct comp 
{ 
    bool operator()(Reputation *one, Reputation *two) 
    { 
     if (one->Amount < 0 && two->Amount >= 0) 
      return false; 
     if (one->Amount >= 0 && two->Amount < 0) 
      return true; 

     if (one->Amount >= 0) 
      return one->Amount <= two->Amount; 
     else 
      return one->Amount >= two->Amount; 
    } 
}; 

그리고이 문제입니다 :

디버그 어설 션 실패!
파일 : .. \ VC \이 xtree
라인 \ 포함 : 638

표현 : 그 후 무효 운영자 <

, 내가 "무시" "다시 시도"또는 선택 "취소"할 수 있습니다. 내가 무시를 선택하면 더 많은 것들 (동일한 것들)이 나타나지만 완벽하게 작동합니다.

이전에 삽입 된 평판 *에 평판을 삽입 할 때 문제가 발생하는 것으로 보입니다. 그러나이 마지막 것에 대해서는 확실하지 않습니다.

은 어떤 도움이 크게

편집을 감상 할 수있다 : 나는 그들에 주문 할 순서는 첫 번째 오름차순 순서로 긍정적 인 사람, 내림차순 순서로 다음 부정적인이다. 예 : 1 5 10 11 11 20 50 -1 -5 -50

답변

6

당신은 단지 <처럼 irreflexive을의 관계를 정의해야합니다 - 따라서 <= '에'> = '<로 변경 > '를 참조하십시오. 이것은 VC++가 진단하는 것입니다.

또한, 주어진 두 개의 항목 A와 B가, 해당 상품이 동등한 것으로 간주되며, 따라서 단지 하나의 세트에 삽입 될 < B 및 B <가 모두 거짓되도록 있으면 올바르게 조작 등 <- 부호화 (항목이 다른 비교에 의해 구별 될 수 있는지 여부는 중요하지 않습니다 : 비교 자 문제에 의해 암시 된 동등한 관계 만).

+0

고맙다. 매우 감사! –

+0

다행 "디버그 주장이 실패했습니다"문제를 해결하는 데 도움이되었지만 "고유성"에 대한 최신 편집을 읽으십시오. _Kasprzol이 말한 것처럼 멀티 세트가 필요합니다. 구별 할 수없는 여러 항목을 유지하려면 _by comparator_. –

+0

예, 이미 Kasprozl의 조언에 따라 멀티 세트로 변환했습니다! –

1

std::set의 항목은 고유해야합니다. (그리고 덜 비견할만한) 동일한 값을 가진 여러 항목을 갖고 싶다면 (제공된 샘플과 같이) std::multiset을 사용하십시오.

참조 : 당신은 같은 표준에 값 :: 설정을 삽입 할 수 없습니다 http://www.cppreference.com/wiki/stl/set/starthttp://www.cppreference.com/wiki/stl/multiset/start

+0

std :: multiset으로 변환했지만 똑같은 문제가 발생합니다. –

0

, 그것은 고유 한 값이 필요합니다. std :: multiset을 사용하십시오. 당신의 재미 주문의 경우

이 작동하는 것 같다 :

struct comp 
{ 
    bool operator()(const Reputation *a, const Reputation *b) 
    { 
     if (a->Amount < 0 && b->Amount < 0) 
      return a->Amount > b->Amount; 
     else if (a->Amount < 0) return false; 
     else if (b->Amount < 0) return true; 
     else return a->Amount < b->Amount; 
    } 
}; 
+0

세트는 포인터 세트입니다. 일부는 동일한 경우에도 모두 고유합니다 -> 금액. 정확한 코드는 \t입니다. multiset sorted; \t (평판 * 담당자 = 평판 :: GetReputationTable(); rep-> Id; ++ 담당자) \t \t sorted.insert (rep); –

+0

오 오케이, 예제에서 명확하지 않았지만 ... 포인터를 포인터를 사용하여 저장하는 경우 예 – stefanB