2010-12-15 10 views
3

Warum kann ich dies tun:mit Vergleichsfunktion in stl Containern

stable_sort(it1, it2, binary_function); 

aber nicht so:

priority_queue<type, vector<type>, binary_function> pq; 

Warum ich eine Funktion im ersten Fall verwenden kann, muss aber ein Objekt in der zweite?

Antwort

1

Wenn Sie die Referenz auf std::stable_sort überprüfen, werden Sie sehen, dass die binary_function, die Sie zur Verfügung gestellt, sollte auch ein Funktion Objekt sein ... Es gibt keinen Unterschied zwischen den beiden, außer dass vielleicht im zweiten Fall gibt es keine richtiger "Cast" oder Umwandlung von einer Funktion zu einem richtigen Funktionsobjekt.

Ich glaube, dies auf die Tatsache zurückzuführen sein, dass *sort Funktionen die Funktors direkt verwenden und sofort, so dass, wenn die Funktion Adresse gültig ist, wenn die *sort Funktion aufgerufen wird, wird es für die Dauer des Funktionsaufrufes gültig. Wenn Sie einen Container erstellen, der (im Wesentlichen) als Datenelement verwendet wird, können Sie nicht sicher sein, dass der Funktionsverweis während der Lebensdauer des Containerobjekts ungültig wird. Ich weiß, es ist eine lockere Handwaving-Erklärung, aber es ist das Beste, was ich mir vorstellen kann. Vielleicht wird in C++ der Verweis auf eine binäre Funktion implizit in die Konstruktion einer std::function konvertiert, so dass die Funktion "kopiert" wird und es kein Gültigkeitsproblem gibt.

ich hoffe ich habe Sie jetzt nicht verloren ...

+0

Im ersten Fall ist 'binary_function' der Name einer Instanz eines Funktionsobjekts oder der Name einer Funktion. Daher kann es im zweiten Fall nicht verwendet werden, wenn der Vorlagenparameter ein Typname (kein Variablen-/Funktionsname) sein muss. – visitor

+0

Ein Funktionsobjekt ist trotzdem eine Klasse, oder? So etwas wie eine Struktur mit 'bool operator (arg)'. Ansonsten ist es nur eine Adresse einer Funktion, die natürlich auch verwendet werden kann, aber nicht in diesem Fall IMHO (wegen unbekannter Lebensdauerprobleme dieser Referenz) – rubenvb

+0

Es gibt einen Unterschied zwischen einer Klasse und einer Instanz dieser Klasse. 'MyFunctor fun;' - 'MyFunctor' ist der Name der Klasse und' fun' ist der Name der Instanz. 'stable_sort' nimmt' fun' (leitet den Typ des Arguments ab) und das Template-Argument von priority_queue nimmt 'MyFunctor' an. – UncleBens

3

priority_queue ist eine Vorlage und erwartet einen Typ als Argument, wo ist binary_function ein Funktionsobjekt ist.

+0

Genauigkeit: in C++ 0x könnten Sie' declltype' verwenden, um den Typ vom Objekt (statisch) abzurufen –