Verwenden Sie immer die Variante, die am besten beschreibt, was Sie vorhaben. Das ist
Tun Sie für jedes Element x
in .vec
bar.process(x)
Lassen Sie uns nun die Beispiele untersuchen:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
Wir haben auch eine for_each
- yippeh . Wir haben die [begin; end)
Reichweite, mit der wir arbeiten wollen.
Im Prinzip war der Algorithmus viel expliziter und daher jeder handschriftlichen Implementierung vorzuziehen. Aber dann ... Bindemittel? Memfun? Grundsätzlich C ++ interna, wie man eine Mitgliedsfunktion bekommt? Für meine Aufgabe interessieren sie mich nicht ! Ich möchte auch nicht unter dieser wortreichen, gruseligen Syntax leiden.
Nun die andere Möglichkeit:
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
Zugegeben, dies ist ein häufig zu erkennendes Muster, aber ... Iteratoren erstellen, Schleifen erstellen, inkrementieren, dereferenzieren. Auch dies sind alles Dinge, die mir egal sind , um meine Aufgabe zu erledigen.
Zugegeben, es sieht viel besser aus als die erste Lösung (zumindest ist der Loop- Body flexibel und ziemlich explizit), aber es ist nicht wirklich so toll. Wir werden dieses verwenden, wenn wir keine bessere Möglichkeit hätten, aber vielleicht haben wir ...
Ein besserer Weg?
Nun zurück zu for_each
. Wäre es nicht großartig, buchstäblich zu sagen for_each
und flexibel in der Operation zu sein, die auch durchgeführt werden soll? Glücklicherweise sind wir seit C ++ 0x Lambdas
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
Nachdem wir eine abstrakte, generische Lösung für viele verwandte Situationen gefunden haben, ist es erwähnenswert, dass es in diesem speziellen Fall einen absoluten Favoriten Nr. 1 gibt :
foreach(const Foo& x, vec) bar.process(x);
Klarer geht es wirklich nicht. Zum Glück ist in C ++ 0x eine ähnliche Syntax integriert !
map(bar.process, vec)
obwohl von einer Karte für Nebenwirkungen abgeraten wird und Listenverständnisse / Generatorausdrücke gegenüber der Karte empfohlen werden).