it-swarm.com.de

c ++ benutzerdefinierte Vergleichsfunktion für std :: sort ()

Ich möchte eine benutzerdefinierte Vergleichsfunktion für std :: sort () erstellen, um einige Schlüssel-Wert-Paare std :: pair zu sortieren

Hier ist meine Funktion

 template <typename K, typename V>
 int comparePairs(const void* left, const void* right){
        if((((pair<K,V>*)left)->first) <= (((pair<K,V>*)right)->first))
            return 1;
        else 
            return -1;
    }

Dann habe ich in einer Klasse den Vektor eines Paarmitglieds:

vector<pair<K,V>> items;  

Und eine Methode zum Sortieren dieses Vektors nach Schlüsseln mit std :: sort ()

std::sort(items.begin(), items.end(), comparePairs<K,V>);

Ich habe Kompilierungsfehler, die besagten

"Die Parameternummer kann nicht von 'std :: pair <_Ty1, _Ty2>' in 'const void *' konvertiert werden."

. Was ist ein Fehler?

21
vard

std :: pair hat bereits die erforderlichen Vergleichsoperatoren, die lexikografische Vergleiche mit beiden Elementen jedes Paares durchführen. Um dies zu verwenden, müssen Sie nur die Vergleichsoperatoren für Typen für die Typen K und V bereitstellen.

Denken Sie auch daran, dass std::sort erfordert einen strengen schwachen Befehl Vergleich, und <= befriedigt das nicht. Sie benötigen zum Beispiel einen Vergleich mit weniger als < für K und V. Alles was Sie dazu brauchen, ist

std::vector<pair<K,V>> items; 
std::sort(items.begin(), items.end()); 

Wenn Sie wirklich eine eigene Vergleichsfunktion bereitstellen müssen, brauchen Sie etwas in der Art von

template <typename K, typename V>
bool comparePairs(const std::pair<K,V>& lhs, const std::pair<K,V>& rhs)
{
  return lhs.first < rhs.first;
}
24
juanchopanza

Schauen Sie hier nach: http://en.cppreference.com/w/cpp/algorithm/sort .

Es sagt:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
  • comp - Vergleichsfunktion, die true zurückgibt, wenn das erste Argument kleiner als das zweite ist. Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen: bool cmp(const Type1 &a, const Type2 &b);

Außerdem ist hier ein Beispiel, wie Sie std::sort Mit einem benutzerdefinierten polymorphen C++ 14-Lambda verwenden können:

std::sort(std::begin(container), std::end(container),
          [] (const auto& lhs, const auto& rhs) {
    return lhs.first < rhs.first;
});
21
Snps

Deine Vergleichsfunktion ist nicht mal falsch.

Die Argumente sollten vom Typ sein, der im Bereich gespeichert ist, d. H. std::pair<K,V>, nicht const void*.

Es sollte bool nicht einen positiven oder negativen Wert zurückgeben. Beide (bool)1 und (bool)-1 sind true, also sagt Ihre Funktion , dass jedes Objekt vor jedem anderen Objekt, was eindeutig unmöglich ist.

Sie müssen den Kleiner-als-Operator modellieren, keine strcmp- oder memcmp -Stilvergleiche.

Siehe StrictWeakOrdering , das die Eigenschaften beschreibt, die die Funktion erfüllen muss.

10
Jonathan Wakely