fbpx

C++: Apply a Callback to an Array

Bjarne-stroustrup
 

In this task, the goal is to take a combined set of elements and apply a function to each element.

C-style Array:

#include <iostream> //cout for printing
#include <algorithm> //for_each defined here

//create the function (print the square)
void print_square(int i) {
	std::cout << i*i << " ";
}

int main() {
	//create the array
	int ary[]={1,2,3,4,5};
	//stl for_each
	std::for_each(ary,ary+5,print_square);
	return 0;
}
//prints 1 4 9 16 25

std::vector

#include <iostream>  // cout for printing
#include <algorithm> // for_each defined here
#include <vector>    // stl vector class

// create the function (print the square)
void print_square(int i) {
	std::cout << i*i << " ";
}

int main() {
	// create the array
	std::vector<int> ary;
	ary.push_back(1);
	ary.push_back(2);
	ary.push_back(3);
	ary.push_back(4);
	ary.push_back(5);
	// stl for_each
	std::for_each(ary.begin(),ary.end(),print_square);
	return 0;
}
//prints 1 4 9 16 25

More tricky with binary function

#include <iostream>   // cout for printing
#include <algorithm>  // for_each defined here
#include <vector>     // stl vector class
#include <functional> // bind and ptr_fun

// create a binary function (print any two arguments together)
template<class type1,class type2>
void print_juxtaposed(type1 x, type2 y) {
	std::cout << x << y;
}

int main() {
	// create the array
	std::vector<int> ary;
	ary.push_back(1);
	ary.push_back(2);
	ary.push_back(3);
	ary.push_back(4);
	ary.push_back(5);
	// stl for_each, using binder and adaptable unary function
	std::for_each(ary.begin(),ary.end(),std::bind2nd(std::ptr_fun(print_juxtaposed<int,std::string>),"x "));
	return 0;
}
//prints 1x 2x 3x 4x 5x

Boost.Lambda

using namespace std;
using namespace boost::lambda;
vector<int> ary(10);
int i = 0;
for_each(ary.begin(), ary.end(), _1 = ++var(i)); // init array
transform(ary.begin(), ary.end(), ostream_iterator<int>(cout, " "), _1 * _1); // square and output

C++11

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

int main() {
	std::vector<int> intVec(10);
	std::iota(std::begin(intVec), std::end(intVec), 1 ); // Fill the vector
	std::transform(std::begin(intVec) , std::end(intVec), std::begin(intVec),
	[](int i) { return i * i ; } ); // Transform it with closures
	std::copy(std::begin(intVec), end(intVec) ,
	std::ostream_iterator<int>(std::cout, " "));
	std::cout << std::endl;
	return 0;
}

SOURCE

Content is available under GNU Free Documentation License 1.2.