C++ std アルゴリズムは、入力シーケンスと出力シーケンスを取り、入力シーケンスの要素から出力シーケンスの要素を作成する多数のアルゴリズムを定義します。(最良の例はstd::transform
.)
std アルゴリズムは明らかiterators
にOutputIterator
.
あれは:
std::vector<int> v1; // e.g. v1 := {1, 2, 3, 4, 5};
std::vector<int> squared;
squared.reserve(v1.size()); // not strictly necessary
std::transform(v1.begin(), v1.end(), std::back_inserter(squared),
[](int x) { return x*x; } ); // λ for convenience, needn't be C++11
そして、これは標準ライブラリに関する限り問題ありません。イテレータが面倒すぎると感じたときは、Boost.Rangeを使って単純化することがよくあります。
ただし、この場合、Boost.Range の変更アルゴリズム もを使用しているようOutputIterators
です。
だから私は現在、そこに便利なライブラリがあるかどうか疑問に思っています.
std::vector<int> const squared = convenient::transform(v1, [](int x) { return x*x; });
――もし無いのなら、無いのには何か理由があるのでしょうか?
編集:実装例(これがすべての場合に機能するかどうか、およびこれが最も理想的なものであるかどうかは不明です):
template<typename C, typename F>
C transform(C const& input, F fun) {
C result;
std::transform(input.begin(), input.end(), std::back_inserter(result), fun);
return result;
}
(注:convenient::transform
返されたベクトルは(N)RVOのためにコピーされないため、手書きのものと同じパフォーマンス特性を持つと思います。とにかく、この質問ではパフォーマンスは二次的なものだと思います。)
編集/注:これまでに提供された回答(コメント、実際)のうち、Davidは非常に優れた基本的な一般的な例を提供しています。
そしてLuc は、wrtの潜在的な問題について言及していますstd::back_inserter
。ジェネリック性。
どちらも、私がこれを自分で作成することをためらう理由と、これを自分でコーディングするよりも「適切な」(適切にテストされた) ライブラリが望ましい理由を示しています。
上記の太字で表現された私の質問、つまり、あるのか、またはない理由があるのか については、ほとんど答えられていません。