ほとんどの関数型プログラミング言語(例:Common LISP、Scheme/Racket、Clojure、Haskell、Scala、Ocaml、SML)は、map
、filter
、takeWhile
、dropWhile
、foldl
、foldr
などのリストのいくつかの一般的な高次関数をサポートします(例:- Common LISP、Scheme/Racket、Clojure side-by-side reference sheet 、 Haskell 、 Scala 、 OCaml 、および [〜#〜] sml [〜#〜] ドキュメント。)
C++ 11には、リストに同等の標準メソッドまたは関数がありますか?たとえば、次のHaskellスニペットを考えてみます。
let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs
現代の標準C++で2番目の式をどのように表現できますか?
std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?
上記の他の高次関数はどうですか?
C++で直接表現できますか?
さらに、C++にはそのような関数があります。 algorithm (または C++ 11を追加した場合 )ヘッダーを確認してください。
std::transform
std::for_each
std::remove_copy_if
それらはどの容器でも簡単に使用できます。
たとえば、コードは次のように表現できます(簡単にコーディングできるC++ 11ラムダを使用)。
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; });
直感的ではありませんが、std::transform
呼び出しを関数に簡単にラップして、新しいコンテナーを返すことができます(パフォーマンスを向上させるためにmove
セマンティクスを使用)。