Die meisten funktionalen Programmiersprachen (zB Common Lisp, Scheme / Schläger, Clojure, Haskell, Scala, Ocaml, SML) unterstützen einige gemeinsame Funktionen höherer Ordnung auf Listen, wie map
, filter
, takeWhile
, dropWhile
, foldl
, foldr
(siehe zB Common Lisp, Scheme / Schläger, Clojure Seite an Seite Referenzblatt , die Haskell- , Scala- , OCaml- und die SML- Dokumentation.)
Verfügt C ++ 11 über gleichwertige Standardmethoden oder -funktionen für Listen? Betrachten Sie beispielsweise das folgende Haskell-Snippet:
let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs
Wie kann ich den zweiten Ausdruck in modernem Standard-C ++ ausdrücken?
std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?
Was ist mit den anderen Funktionen höherer Ordnung, die oben erwähnt wurden?
Können sie direkt in C ++ ausgedrückt werden?
Data.Sequence
in Haskell durchzuführen ? Es ist vergleichsweise hässlich.[a]
. Sie müssen entweder die Vorspielfunktion ausblenden, das Vorspiel durchgehen oder einen anderen und weniger intuitiven Namen wählen.Functor
,Foldable
undTraversable
dies auf eine so abstrakte Art und Weise zu erreichen, wie ich denken kann.Data.Sequence
ist eine Instanz von all diesen, so können Sie einfach tunfmap (\x -> x * x) xs
.map
istfmap
spezialisiert für Anfänger.Antworten:
Noch mehr, C ++ hat solche Funktionen, werfen Sie einen Blick auf den Header des Algorithmus (oder mit C ++ 11-Zusätzen ):
Sie können problemlos mit jedem Behälter verwendet werden.
Zum Beispiel kann Ihr Code so ausgedrückt werden (mit C ++ 11 Lambdas zur einfachen Codierung):
Weniger intuitiv, aber Sie können den
std::transform
Aufruf leicht in eine Funktionmove
umbrechen, die einen neuen Container zurückgibt (mit Semantik für eine bessere Leistung).quelle
std::transform
dauert zwei Iteratoren, so können Sie ein Stück eines Containers nehmen (denken Sie daran, dass Sie Iteratoren Arithmetik haben).std::transform
wie:Y<U> map(T<U>, std::function<Y(U)>)
.