2016-06-12 2 views
2

Ich möchte eine Strukturliste, eine Paar-Struktur eines Iterators und Doppelwert;Sortierung einer Liste mit Strukturpaar mit Std :: Sort

Das obige ist mein Versuch. Meine Struktur ist

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

Meine Sortierfunktion ist;

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

Liste der Strukturwerte erstellen; es ist distance_pair, beachte seinen Typ.

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; 
    } 

Nun meine attemt eine sortierte Struktur Liste zu machen, wo die Reihenfolge der Entfernung wird in Werte accending, meine Vergleichsfunktion MyDataSortPredicate verwenden,

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

Der Fehler ist:

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); 

Und ziemlich mehr Text.

+0

Ich habe Probleme mit Template-Parameter-Typen Lesen durch. Könnten Sie bitte einige Typedefs hinzufügen und möglicherweise die Quelle neu formatieren, um Ihre Absicht zu verdeutlichen? – rubicks

Antwort

2

MyDataSortPredicate ist kein konkretes Objekt oder Funktion. Es ist eine Funktionsvorlage. Daher kann es nicht als Argument für eine Funktion übergeben werden. Sie müssen es mit einem Template-Argument instanziieren.

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

Wenn Sie explizit nicht wollen, für den Komparator Art schaffen, können Sie eine polymorfic Funktionsobjekt wie std::less<void> machen:

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

Ja, das würde ich tun. War dabei, dies in meine Antwort zu schreiben. –

Verwandte Themen