C++のstd::transformは、変換先のコンテナを呼び出し側で確保してイテレータ書く必要があるので、たいがいの場合に冗長。
関数型のmap関数のように、自動で変換先のstd::vectorを作って返すstd::transformが欲しかったので、下記のようなものを書いてみた。
# include <algorithm>
# include <iostream>
# include <type_traits>
# include <vector>
template <
typename Input, // 引数から推論されるので省略可
typename Functor, // 引数から推論されるので省略可
typename Output = typename std::result_of<Functor(Input)>::type
>
std::vector<Output> transform_copy(
const std::vector<Input>& inputs,
Functor func
) {
std::vector<Output> outputs(inputs.size());
std::transform(inputs.cbegin(), inputs.cend(), outputs.begin(), func);
return outputs; // NRVOが効いてmoveされるはず
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto element : transform_copy(vec, [](int i){ return i * i; })) {
std::cout << element << ", "; // 1, 4, 9, 16, 25,
}
std::cout << std::endl;
return 0;
}
実行結果:[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ
std::result_ofのおかげで、テンプレート引数書かなくて済むのがポイント。
C++11で導入された型操作ライブラリに入っている。
Standard library header - cppreference.com