2015-01-13 2 views
1

I 이러한 구조 가지고비교 함수 표준 : 설정 <표준 : 페어 <INT, 표준 : 쌍 <int,int> >>

typedef std::pair<unsigned int, std::pair<int, int> > myPair; 
typedef std::set< myPair> Graph; 

Graph g; 

같은 그래프를 분류에 적합한 비교 기능은 무엇인가?

struct Cmp{ 
    bool operator()(const myPair& l, const myPair& r)const{ 
     return l.second.second < r.second.second; 
    } 
}; 

내가 가장 안쪽 쌍 두 번째 요소에 따라 정렬 할 세트를 원하는 :

std::sort(g.begin(), g.end(), Cmp()); 

나는이 같은 일을 시도했다. 가능한가?

a = (std::make_pair(0,std::make_pair(1,1))); 
b = (std::make_pair(0,std::make_pair(1,2))); 
c = (std::make_pair(0,std::make_pair(1,0))); 
d = (std::make_pair(1,std::make_pair(2,0))); 

결과는 다음과 같습니다 발주처

c = (0,(1,0)), d = (1,(2,0), a = (0,(1,1)), b = (0,(1,2)) 

질문 한 후 주문

c = (0,(1,0)), a = (0,(1,1)), b = (0,(1,2)), d = (1,(2,0) 

전에

을 :이 주문 방식으로 세트를 만들 수 있습니까?

답변

0

비교 기능은 좋은 시작입니다. 누락 된 부분은 "타이 해상도"입니다. 당신은 때 l.second.second == r.second.second 무슨 일 지정해야 할 때, 그리고 l.second.first == r.second.first 또한 어떤 일이 발생 :

bool operator()(const myPair& l, const myPair& r)const{ 
    return (l.second.second < r.second.second) || 
      ((l.second.second == r.second.second) && (l.second.first < r.second.first)) || 
      ((l.second.second == r.second.second) && (l.second.first == r.second.first) && (l.first < r.first)). 
} 
  • 첫 번째 조건이 구현에서 비롯됩니다.
  • 두 번째 조건은 첫 번째 우선 순위 항목이 서로 같을 때 수행 할 작업을 알려줍니다.
  • 세 번째 조건은 첫 번째 우선 순위 항목과 두 번째 우선 순위 항목이 모두 같을 때 수행 할 작업을 알려줍니다.

집합을 정렬하는 데이 함수를 사용하려면 두 번째 템플릿 매개 변수로 std::set으로 전달해야합니다. Here is a Q&A explaining how to do it.

0

std::set에 전화 할 수 없지만 set은 조건부로 구성 할 수 있습니다.

typedef std::set<myPair, Cmp> Graph; 
0

또 다른 조건자를 사용하면 set이 필요합니다. 기존 set의 정렬 알고리즘을 변경할 수 없습니다.

관련 문제