Back to TILs

C++ for_each

Table of contents

Lambda vs Object Function

The lambda function [](const int &e){} is equivalent to an object function like this:

struct FunctionObjectPrinter {
  void operator()( const int &e )
  {
    cout << e << ", ";
  }
};

The lambda function [prefix](const int &e){} is equivalent to an object function like this:

struct FunctionObjectPrinterWithPrefix {
  explicit FunctionObjectPrinterWithPrefix( const string &prefix ) : mPrefix( prefix )
  {
  }
  void operator()( const int &e )
  {
    cout << mPrefix << " " << e << ", ";
  }

private:
  string mPrefix;
};
  list<int> v{ 1, 2, 3, 4, 5 };

Range operator

  for( auto &e : v ) {
    cout << e << ", ";
  }
  cout << "range operator" << endl;

Function object

  FunctionObjectPrinter p;
  for_each( begin( v ), end( v ), p );
  cout << "function operator" << endl;

Inline lambda

  for_each( begin( v ), end( v ), []( const int &e ) { cout << e << ", "; } );
  cout << "inline lambda" << endl;

Lambda

  auto print = []( const int &n ) { cout << n << ", "; };
  for_each( begin( v ), end( v ), print );
  cout << "lambda" << endl;

Range operator + lambda

  for( auto &e : v ) {
    print( e );
  }
  cout << "range operator + lambda" << endl;

## Output


```txt
1, 2, 3, 4, 5, range operator
1, 2, 3, 4, 5, function operator
1, 2, 3, 4, 5, inline lambda
1, 2, 3, 4, 5, lambda
1, 2, 3, 4, 5, range operator + lambda