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は関数ポインタを関数オブジェクトに変換してくれる.class1は引数の型,class2は返り値の型を表す.

言葉で書くよりもコードを載せる方がわかりやすいのでメモ.

#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;
}

なるほど,これで少しは書きやすくなった.