Überarbeitung für Schleife über STL-Container, um Funktionstechniken zu verwenden

8

Ich habe ein std::vector von Zeigern Person -Objekten, die eine Mitgliedsfunktion std::string getName() const haben. Mit STL-Algorithmen möchte ich alle Person -Objekte im Vektor zählen, wobei getName() "Chad" zurückgibt.

Das Verhalten, das einfach über die Schleife iteriert, wäre:

%Vor%

Ich möchte das so überarbeiten, dass es alle STL-Algorithmen und Funktoren usw. verwendet (damit es funktionaler wird). Dies ist, was ich denke, dass ich tun muss:

%Vor%

Wie Sie wahrscheinlich wissen, funktioniert das nicht. Erstens, so wie ich es verstehe, können Sie bind1st / bind2nd nicht für binder1st / binder2nd-Objekte verwenden, da sie speziell für die Arbeit mit std::binary_functions konzipiert sind. Zweitens, und viel wichtiger, glaube ich nicht, dass ich die richtige Technik verwende. Ich mache möchte eines der Argumente an "Chad" binden, aber mit dem Iterator-Argument möchte ich eigentlich nur den Iterator-Wert in einen String umwandeln, bevor ich die gebundene Version von equals_to aufrufen kann.

Ich denke, es ist möglich, dies mit Boost zu tun, aber ist es möglich, nur den Kern C ++ 03 (d. h. keine C ++ 0x Lambda!) zu verwenden?

BEARBEITEN: Kann jemand ein Beispiel finden, das kein benutzerdefiniertes Prädikat verwendet (d. h. nur die Werkzeuge, die im std-Toolkit enthalten sind)?

EDIT: Während Matthieus Antwort eine Lehrbuch-Antwort für die Verwendung von Funktoren in STL-Algorithmen ist, kam Cubbi's Antwort von dem Ansatz, den ich suchte (obwohl Mathieu schon geantwortet hat, bevor ich die Frage bearbeitet habe, um sie genauer zu machen, also entschuldige mich !).

    
Christopher Howlin 16.03.2011, 12:16
quelle

3 Antworten

5

Da noch niemand den eigentlichen Boost-Code gepostet hat, C ++ 98 mit boost:

%Vor%

Testlauf Ссылка

Wie für reines C ++ glaube ich nicht, dass es ohne den compose1 Adapter möglich ist, der in STL aber nicht in C ++ stdlib vorhanden ist ...

und hier ist es (mit GCC-Implementierung von STL)

%Vor%

Testlauf: Ссылка

BEARBEITEN: korrigiert um Person*

zu berücksichtigen     
Cubbi 16.03.2011, 14:29
quelle
9

Ich habe Lambdas immer als relativ unlesbar empfunden. Ich bevorzuge es, explizite Typen zu schreiben:

%Vor%

Obwohl die Definition von Named "out-of-line" ist, vermittelt ein richtig gewählter Name die Absicht und verbirgt die Implementierungsdetails. Persönlich halte ich das für eine gute Sache, denn dann lenke ich nicht durch Implementierungsdetails ab oder versuche herauszufinden, was passiert, indem ich den Code reverse-engineeriere (so offensichtlich er auch sein mag).

    
Matthieu M. 16.03.2011 13:24
quelle
1

Verwenden Sie boost::bind , es ist in gewisser Weise den bestehenden Standard-Bindungsmechanismen überlegen. boost::bind ist vollständig C ++ 03 kompatibel.

    
Puppy 16.03.2011 13:36
quelle