Bei fast dem gesamten Code, den ich schreibe, habe ich häufig Probleme mit der Reduzierung von Sätzen in Sammlungen, die letztendlich zu naiven "Wenn" -Bedingungen führen. Hier ist ein einfaches Beispiel:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
Mit funktionalen Sprachen kann ich das Problem lösen, indem ich die Sammlung (einfach) auf eine andere Sammlung reduziere und dann alle Operationen an meinem reduzierten Satz ausführe. Im Pseudocode:
newCollection <- myCollection where <x=true
map DoStuff newCollection
Und in anderen C-Varianten wie C # könnte ich mit einer where-Klausel wie reduzieren
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
Oder besser (zumindest für meine Augen)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Zugegeben, ich mache viel Paradigmenmischung und subjektiven / meinungsbasierten Stil, aber ich kann nicht anders, als das Gefühl zu haben, dass mir etwas wirklich Grundlegendes fehlt, das es mir ermöglichen könnte, diese bevorzugte Technik mit C ++ zu verwenden. Könnte mich jemand aufklären?
if
Innere , das for
Sie erwähnen, nicht nur den anderen Beispielen funktional ziemlich äquivalent ist, sondern in vielen Fällen wahrscheinlich auch schneller wäre. Auch für jemanden, der behauptet, funktionalen Stil zu mögen, scheint das, was Sie fördern, gegen das geliebte Konzept der Reinheit der funktionalen Programmierung zu DoStuff
verstoßen, da es eindeutig Nebenwirkungen hat.
std::copy_if
, aber die Auswahl ist nicht faul