web-dev-qa-db-ja.com

高次リスト関数のC ++ 11サポート

ほとんどの関数型プログラミング言語(例:Common LISP、Scheme/Racket、Clojure、Haskell、Scala、Ocaml、SML)は、mapfiltertakeWhiledropWhilefoldlfoldrなどのリストのいくつかの一般的な高次関数をサポートします(例:- Common LISP、Scheme/Racket、Clojure side-by-side reference sheetHaskellScalaOCaml 、および [〜#〜] 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++で直接表現できますか?

13
Giorgio

さらに、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セマンティクスを使用)。

16
m0nhawk