std::vectorのようなSTLコンテナの各要素に指定した関数を適用した結果を得る
std::vectorのようなSTLコンテナの各要素に対して関数を適用した結果を簡単に書きたい.
Perlでいうところのこんなイメージ.
my @list = (1.0, 1.5, 2.0, 2.5); my @exp_list = map { exp($_) } @list;
C++ではどう書くのだろう? STLで対応する関数が用意されているだろうなぁと思って手書きしていたので,今回ちゃんと調べてみたので自分用メモ.
結論からいえば,std::transform (algorithmヘッダ) を利用すればよい.ただし,最後の引数が関数オブジェクトである必要があるので,そのままではstd::expのような関数ポインタを利用できない.そこでstd::ptr_fun (functionalヘッダ) という関数アダプタ (と呼ばれるもの) を利用する.C++使いには常識なのだろうけれど,今日初めて知った.
ptr_fun
言葉で書くよりもコードを載せる方がわかりやすいのでメモ.
#include <iostream> #include <vector> #include <functional> #include <algorithm> #include <cmath> int main (int argc, char *argv[]) { std::vector<double> vec; vec.push_back( 1.0 ); vec.push_back( 1.5 ); vec.push_back( 2.0 ); vec.push_back( 2.5 ); std::transform(vec.begin(), vec.end(), vec.begin(), std::ptr_fun<double, double>( std::exp ) ); for (int i = 0; i < (int)vec.size(); i++) { std::cout << vec[ i ] << std::endl; } return 0; }
なるほど,これで少しは書きやすくなった.