Back to TILs

C++ for_each

Date: 2018-10-13Last modified: 2022-12-17

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