Table of Contents
Apply Function to Range
for_each loop applies a function to the range of elements of a collection. In other words each element from the collection will be passed to the function as a parameter and function will be executed the number of times elements present in a collection. This loop is defined in a algorithm header so have to include this header in your program to use for_each
#include
Below is the syntax of for_each loop
Syntax of for_each
for_each (InputIterator first, InputIterator last, Function fn)
for_each applies function fn for each element in the range starting from first to last.
#include
#include
using namespace std;
void fun1(int x)
{
cout << x << " ";
}
struct Class1 // object type function
{
void operator() (int x)
{
cout << x << " ";
}
} obj1;
int main()
{
int arr[] = {11, 21, 4, 13};
for_each(arr, arr + 4, fun1);
cout << endl;
for_each(arr, arr + 4, obj1);
return 0;
}The output of above code will be
11 21 4 13
11 21 4 13
Above code can also be written using vector as below
#include
#include
using namespace std;
void fun1(int x)
{
cout << x << " ";
}
struct Class1 // object type function
{
void operator() (int x)
{
cout << x << " ";
}
} obj1;
int main()
{
vector v1;
v1.push_back(11);
v1.push_back(23);
v1.push_back(4);
v1.push_back(13);
for_each(v1.begin(), v1.end(), fun1);
cout << endl;
for_each(v1.begin(), v1.end(), obj1);
return 0;
}Exception in for_each
If the function throws an exception then for_each will also throw the same exception and will break/terminate the loop. Below is an example for the exception case.
#include
#include
using namespace std;
void fun1(int x)
{
cout << x << " ";
if (x % 2 == 0)
{
throw 100;
}
}
struct Class1 // object type function
{
void operator() (int x)
{
cout << x << " ";
if (x % 2 == 0)
{
throw 100;
}
}
} myobject;
int main()
{
vector v1;
v1.push_back(11);
v1.push_back(23);
v1.push_back(4);
v1.push_back(13);
try
{
for_each(v1.begin(), v1.end(), fun1);
}
catch (int i)
{
cout << endl << "Got exception...Value thrown is " << i << endl;
}
try
{
for_each (v1.begin(), v1.end(), myobject);
}
catch (int i)
{
cout << endl << "Got exception...Value thrown is " << i << endl;
}
return 0;
}Output of above code will be
11 23 4
Got exception…Value thrown is 100
11 23 4
Got exception…Value thrown is 100
Advantages of for_each loop
- Allows us to write an algorithm on top of for_each that works with any iterator.
- Silly typing bugs can be reduced.
- for_each is more generic than ‘for loop’ as we can use it to iterate over any type of container.
- for_each makes more readable code.
- Performance: Code containing for_each are more efficient.