2017-01-24 1 views
1

에 추가 인수 목록을 정렬 다음감안할 때 비교 함수

class Coordinate { 
    int i,j; 
}; 

list<shared_ptr<Coordinate>> coordinates; 

(Coordinate 내 코드는 정말 포함 된 내용을 단지 훨씬 간단 버전입니다.) 나는 최소 유클리드 거리에 존경과 list을 정렬 할 주어진 좌표 iCenter,jCenter. 이 좌표에 가장 가까운 Coordinate은 목록 coordinates의 첫 번째 위치에 있어야합니다. Furterhmore, 나는

struct ComparatorForCoordinate { 
    bool operator() (const shared_ptr<Coordinate>& c1, const shared_ptr<Coordinate>& c2) { 
    // return distance(c1 to center) > distance(c2 to center) 
    } 
}; 

// sorting: 
coordinates.sort(ComparatorForCoordinate()); 

내 문제는 내 operator() 요구는이 iCenter,jCenter 좌표를 알고 있다는 것입니다 구조 다음 사용하려고합니다. 이 두 개의 double 값을 어떻게 비교 함수에 전달할 수 있습니까? 연산자가 추가적으로 중심 위치에 대한 두 개의 이중 매개 변수를 갖도록하는 순진한 시도는 효과가 없습니다.

coordinates.sort(ComparatorForCoordinate(iCenter,jCenter)); 
+0

내가 제목을 쥐게했으며, 추가 그 다른 사용자가이 질문 (및 답)을 쉽게 찾을 수 있습니다. 변경 사항을 마음에 들지 않으면 되돌릴 수 있습니다. –

답변

3

당신은 당신의 비교기에 상태를 추가 할 수 있습니다 : 그것은 작동 할 경우이 호출은 나를 위해 좋은 것입니다 희망에서 STL 태그를

struct ComparatorForCoordinate { 
    ComparatorForCoordinate(Coordinate center) : _center(center) {} 

    bool operator() (const shared_ptr<Coordinate>& c1, const shared_ptr<Coordinate>& c2) const { 
    return distance(c1, _center) > distance(c2, _center); 
    } 

private: 
    Coordinate _center; 
}; 

// sorting: 
coordinates.sort(ComparatorForCoordinate(center)); 
+0

이것이 작동합니다 ... 이제 두 개의 다른 비교 함수가있는 경우 (예 : 하나는 유클리드 거리에 따라 정렬하고 하나는'i' 값 사이의 거리에 따라 정렬합니다. Comparator로 두개의 structs가 필요합니까? 아니면이 두 비교 함수를 같은 struct에 넣을 수 있습니까? – Kapa11

+0

@ Kapa11 : 'bool euclidean' 인수를 비교 자 생성자에 추가하고 모든 비교 중에이를 확인할 수 있습니다. 그러나 별도의 비교기를 작성하는 것이 더 효율적이고 관용적 일 것입니다. –

+0

대단히 감사합니다, 그게 내가 검색 한 것입니다 :) – Kapa11