Wie kann ich Boost.Bind auf zusammengesetzten Typen verwenden?

8

Ich habe std::map<int, std::pair<short, float> > , und ich muss die minimale short in dieser Map finden. Wie kann ich boost::bind mit std::min_element() dafür verwenden?

boost::lambda ?

    
Andriy Tylychko 25.01.2011, 15:43
quelle

3 Antworten

6

Der map Iterator gibt Ihnen eine pair wobei first der Schlüssel int und second der Wert pair der Karte ist. Wenn Sie also einen Iterator it hätten, würden Sie möchte das Minimum aller it->second.first -Werte. Die Funktion min_element erwartet eine Vergleichsfunktion für ihr drittes Argument. Daher müssen Sie eine Vergleichsfunktion erstellen, die second.first ihrer zwei Argumente projiziert.

Wir beginnen mit einigen typedefs, um den Code lesbarer zu machen:

%Vor%

Wir werden Boost.Lambda für seine überladenen Operatoren verwenden, damit wir operator< verwenden können. Boost.Bind kann Member-Variablen und Member-Funktionen binden, also werden wir auch davon profitieren.

%Vor%

Das funktioniert auch mit boost::lambda::bind .

    
Rob Kennedy 25.01.2011, 16:37
quelle
5
%Vor%

(Natürlich wird sich jemand beschweren, dass dies ein Missbrauch von STL ist und dass diese Erweiterungen nicht im C ++ Standard sind ...)

    
ephemient 25.01.2011 16:15
quelle
2

bind kann das nicht alleine machen, weil first und second als Felder offengelegt werden, nicht als Methoden (Sie können also nicht mit etwas wie mem_fun davonkommen).

Das könntest du natürlich auch mit deinem eigenen Funktor machen:

%Vor%     
Billy ONeal 25.01.2011 16:12
quelle

Tags und Links