C ++ 11 supporto per le funzioni di elenco di ordine superiore

12

La maggior parte dei linguaggi di programmazione funzionali (es. Common Lisp, Scheme / Racket, Clojure, Haskell, Scala, Ocaml, SML) supportano alcune funzioni di ordine superiore comuni sugli elenchi, come map , filter , takeWhile , dropWhile , foldl , foldr (vedi ad esempio foglio di riferimento affiancato Common Lisp, Scheme / Racket, Clojure side-by-side , Haskell , Scala , OCaml e SML documentazione.)

Il C ++ 11 ha metodi o funzioni standard equivalenti negli elenchi? Ad esempio, considera il seguente frammento di Haskell:

let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs

Come posso esprimere la seconda espressione nel moderno standard C ++?

std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?

E le altre funzioni di ordine superiore sopra menzionate?
Possono essere espressi direttamente in C ++?

    
posta Giorgio 18.10.2012 - 22:10
fonte

1 risposta

15

Ancora di più, C ++ ha funzioni simili, dai uno sguardo a algoritmo (o with C ++ 11 additions ) header:

std::transform
std::for_each
std::remove_copy_if

Possono essere facilmente usati con qualsiasi contenitore.

Ad esempio il tuo codice può essere espresso in questo modo (con C ++ 11 lambda per una facile codifica):

std::vector<int> x = {1, 2, 3, 4, 5};
std::vector<int> y;
std::transform(x.begin(), x.end(), std::back_inserter(y), [](int elem){ return elem * elem; });

Meno intuitivo, ma puoi facilmente racchiudere la chiamata di std::transform in una funzione che restituirebbe un nuovo contenitore (con% sem_e_de% per una migliore perfomance).

    
risposta data 18.10.2012 - 22:35
fonte

Leggi altre domande sui tag