Visualization Tool Kit(VTK)など

関数オブジェクトをその場で作るのがラムダ式(無名関数).当然,関数オブジェクトを使う関数に対して使う.
関数の名前の代わりに [] と記述する.下記のコードはVisual Studio 2010 で動作する.

[](/*引数...*/) { /*実装*/ }

template<typename Ty>
class PrintArray
{
public:
  void operator()(const Ty val)
  {
    std::cout << val << " ";
  } 
};

int data[5] = { 1, 2, 3, 4, 5 };  
//通常の関数オブジェクト版
std::for_each(data, data+5, PrintArray<int>());

//ラムダ関数による置き換え
std::for_each(data, data+5, [](const int val) { std::cout << val << " "; } );
std::cout << std::endl;


例2 絶対値ソート

  int data[10] = { 0, -2, 4, -6, 8, 1, -3, 5, 7, -9 };
  std::sort(data, data+10, [](const int x, const int y) { return std::abs(x) < std::abs(y); } );
  std::for_each( data, data+10, [](const int x) { std::cout << x << " "; } );
  std::cout << std::endl;


例3 ラムダ式を変数に入れる
autoを使えば簡単.というか複雑なテンプレート型を書いてられないからautoがでてきた.
  auto PrintFunc = [](const int x) { std::cout << x << " "; };
  std::for_each( data, data+10, PrintFunc);

例4 ローカル変数を使う [&]
  std::vector<double> data = GetData(); //Some data
  std::ofstream ofs(_outPath); // File name to save
  if( ofs.is_open() )
  {
    std::for_each( data.begin(), data.end(), [&ofs](double d) { ofs << std::setw(15) << d; } );
    ofs << std::endl;
  }

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー

チュートリアル

アルゴリズム(数学)

並列計算

STL

#include<memory> #include<string> #include<sstream> #include<algorithm> #include<functional> #include<numeric>

Media Foundation

【メニュー編集】
Wiki記法ガイド

メンバーのみ編集できます