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.

Our team found a curious site for our readers that are fans of online gaming, a rather exciting site that provides the latest gaming technology. Casinodots.com is the site, they compile the best reviews of MGA casino utan svensk licens sites. This site might pique your curiosity and you can win extra money!