2010-12-15 7 views
1

Momentan führe ich eine for-Schleife aus, in der ich jedes Element in einem STL-Container anrufe, ähnlich dem Folgenden.Kann der STL for_each-Algorithmus mit einer Funktion mit unabhängigen Eingangsparametern verwendet werden?

Ich suche den for_each STL-Algorithmus, wie es scheint, meine Bedürfnisse zu erfüllen.

Ich frage mich, ob es angesichts der Verwendung eines zweiten Eingabeparameters für die Funktion, die auf den Container angewendet wird, möglich ist, dies zu refaktorisieren, um einen Standard-STL-Algorithmus zu verwenden, ohne Membervariablen oder andere Lücken zu verwenden?

Antwort

4

Die verschiedenen std::bind1st/std::bind2nd und die Boost.bind wurden Bibliothek erstellt Ihr Problem zu lösen (das ist gemeinsam, fast alle, die die STL-Algorithmen verwendet wird), aber oft scheinen sie nur eine Abhilfe anstelle einer Lösung.

Zum Glück, mit dem bevorstehenden C++ - Standard sollte die lang erwartete Hinzufügung von lambda functions definitiv das Problem lösen. Beachten Sie jedoch, dass std::for_each den Funktor aufruft, der den dereferenzierten Iterator übergibt (d. H. Der tatsächliche Wert, der berücksichtigt wird), Ihre AddToUpdate-Funktion sollte den Iterator aber den Wert nicht akzeptieren.

In einem solchen Fall wäre es so etwas wie dieses:

Update update; 
std::foreach(container.begin(); container.end(); [ & update](TypeOfTheValue Value) { 
    AddToUpdate(Value, update); 
}); 
+0

Eine andere Option ist, einen Funktor zu schreiben, um die Arbeit zu erledigen. Das würde ein Verhalten ähnlich der Lambda-Version erreichen, aber ohne Compiler-Unterstützung für C++ 0x zu benötigen. – jalf

+1

Der ganze Punkt der Bindung ist nicht, Funktoren zu schreiben. –

4

Sie wollen std::bind2nd() verwenden - es http://www.cplusplus.com/reference/std/functional/bind2nd/

Grundsätzlich eine einstellige Funktion Objekt aus Funktion mit zwei Argumenten zurück, wo das zweite Argument festgelegt ist. Diese

ist, wie Sie Ihren Code wie mit for_each und bind2nd aussehen sollte:

Update update; 
for_each(container.begin(), container.end(), bind2nd(ptr_fun(AddToUpdate), update)); 

bearbeiten. Wie Matteo bemerkte das erste Argument von AddToUpdate muss Typ des Werts im Container sein, kein Iterator.

+1

Aber das funktioniert nur auf functors von 'std :: binary_function' ableiten, nicht auf Funktionen. –

+2

@Konrad, das mit 'std :: ptr_fun' gelöst werden könnte. –

+1

Rechts, bearbeitet. Ich bin es gewöhnt, 'boost :: bind 'zu benutzen, also habe ich vergessen, wie viel Schmerz reine STL war. –