2016-06-12 8 views
2

구조체 목록, 반복기의 쌍 구조체 및 double 값을 정렬하려고합니다.std :: sort를 사용하여 구조체 쌍으로 목록 정렬

위 내용이 저의 시도입니다. 내 구조체는

template<class Iterator> 
struct Pair{ 
    double distance; 
    Iterator iterator; }; 

입니다. 내 정렬 기능은 다음과 같습니다.

template<class SetIterator> 
     static bool MyDataSortPredicate(const Pair<SetIterator>& lhs, const Pair<SetIterator>& rhs){ 
      return lhs.distance < rhs.distance; 
     } 

구조체 값 목록 만들기. 그것은 distance_pair이며, 그 타입을 주목하라.

error: no matching function for call to 'sort' 
     std::sort(distance_pair.begin(),distance_pair.end(),MyDataSortPredicate); 
     ^~~~~~~~~ 
main_test.cpp:51:2: note: in instantiation of function template specialization 
     'createSortedPointDistancePairs<std::__1::__wrap_iter<Vector *> >' requested here 
     createSortedPointDistancePairs(vector_contains.begin(), vector_contains.end(), query); 
:
template<class SetIterator> 
std::vector<Pair<SetIterator> > createSortedPointDistancePairs( 
    SetIterator begin, SetIterator end,Vector const& query){ 
    std::vector<double> it(std::distance(begin,end)); 
    std::vector<double>::iterator iter; 
    std::vector<Pair<SetIterator> > distance_pair(std::distance(begin,end)); //to make space 
    computeDistances(begin, end, query, it.begin()); 
    SetIterator pos = begin; 
    int i = 0; 
    for(iter = it.begin(); iter!=it.end();++iter,i++){ 
     if (pos!=end){ 
      Pair<SetIterator> set; 
      set.distance = *iter; 
      set.iterator = pos; 
      distance_pair[i] = set; 
      } 
     ++pos; 
    } 

지금 내 attemt 거리의 순서가 내 비교 기능 MyDataSortPredicate를 사용하여 값을 accending입니다되는 분류 구조체 목록,

std::sort(distance_pair.begin(),distance_pair.end(),MyDataSortPredicate); 

오류가 만들려면

그리고 더 많은 텍스트.

+0

내가 문제 템플릿 매개 변수 유형을 읽는 데 문제가 있습니다. 일부 typedef를 추가하고 가능하면 소스를 다시 포맷하여 의도를 명확히 할 수 있습니까? – rubicks

답변

2

MyDataSortPredicate은 구체적인 개체 또는 기능이 아닙니다. 그것은 함수 템플릿입니다. 따라서 함수에 인수로 전달할 수 없습니다. 템플리트 인수로 인스턴스를 생성해야합니다.

std::sort(distance_pair.begin(),distance_pair.end(),MyDataSortPredicate<SomeType>); 
2

당신이 명시 적으로 비교기에 대한 유형을 제공하지 않으려면, 당신은 할 수 std::less<void> 같은 polymorfic 함수 객체 :

struct MyDataSortPredicate 
{ 
    template <typename SetIterator> 
    bool operator(const Pair<SetIterator>& lhs, const Pair<SetIterator>& rhs) 
    { 
     return lhs.distance < rhs.distance; 
    } 
}; 
+1

네, 이것이 내가 할 일입니다. 이것을 내 대답으로 편집하는 과정에있었습니다. –

관련 문제