#include <iostream>
#include <vector>
#include <list>
#include <functional>
#include <algorithm>
template<typename T, typename U>
void apply(T collBegin, T collEnd, std::function<bool(U const &)> f1, std::function<U(U const &)> f2, std::function<U(U const &)> f3)
{
std::for_each(collBegin, collEnd, [&](auto &el) { el = f1(el) ? f2(el) : f3(el); });
}
int main()
{
std::function<bool(int const &)> predicate = [](int const &arg) -> bool { return arg % 2 == 0; };
std::function<int(int const &)> passed = [](int const &arg) -> int { return arg / 2; };
std::function<int(int const &)> rejected = [](int const &arg) -> int { return (3 * arg) + 1; };
int arr[]{ 1,2,3,4,5,6,7,8,9 };
apply(arr, arr + sizeof(arr)/sizeof(int), predicate, passed, rejected);
std::vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));
apply(vec.begin(), vec.end(), predicate, passed, rejected);
std::list<int> lis(vec.begin(), vec.end());
apply(lis.begin(), lis.end(), predicate, passed, rejected);
for (auto e : lis) std::cout << e << " ";
std::cout << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgp2b2lkIGFwcGx5KFQgY29sbEJlZ2luLCBUIGNvbGxFbmQsIHN0ZDo6ZnVuY3Rpb248Ym9vbChVIGNvbnN0ICYpPiBmMSwgc3RkOjpmdW5jdGlvbjxVKFUgY29uc3QgJik+IGYyLCBzdGQ6OmZ1bmN0aW9uPFUoVSBjb25zdCAmKT4gZjMpCnsKCXN0ZDo6Zm9yX2VhY2goY29sbEJlZ2luLCBjb2xsRW5kLCBbJl0oYXV0byAmZWwpIHsgZWwgPSBmMShlbCkgPyBmMihlbCkgOiBmMyhlbCk7IH0pOwp9CgppbnQgbWFpbigpCnsKCXN0ZDo6ZnVuY3Rpb248Ym9vbChpbnQgY29uc3QgJik+IHByZWRpY2F0ZSA9IFtdKGludCBjb25zdCAmYXJnKSAtPiBib29sIHsgcmV0dXJuIGFyZyAlIDIgPT0gMDsgfTsKCXN0ZDo6ZnVuY3Rpb248aW50KGludCBjb25zdCAmKT4gcGFzc2VkID0gW10oaW50IGNvbnN0ICZhcmcpIC0+IGludCB7IHJldHVybiBhcmcgLyAyOyB9OwoJc3RkOjpmdW5jdGlvbjxpbnQoaW50IGNvbnN0ICYpPiByZWplY3RlZCA9IFtdKGludCBjb25zdCAmYXJnKSAtPiBpbnQgeyByZXR1cm4gKDMgKiBhcmcpICsgMTsgfTsKCglpbnQgYXJyW117IDEsMiwzLDQsNSw2LDcsOCw5IH07CglhcHBseShhcnIsIGFyciArIHNpemVvZihhcnIpL3NpemVvZihpbnQpLCBwcmVkaWNhdGUsIHBhc3NlZCwgcmVqZWN0ZWQpOwoKCXN0ZDo6dmVjdG9yPGludD4gdmVjKGFyciwgYXJyICsgc2l6ZW9mKGFycikgLyBzaXplb2YoaW50KSk7CglhcHBseSh2ZWMuYmVnaW4oKSwgdmVjLmVuZCgpLCBwcmVkaWNhdGUsIHBhc3NlZCwgcmVqZWN0ZWQpOwoKCXN0ZDo6bGlzdDxpbnQ+IGxpcyh2ZWMuYmVnaW4oKSwgdmVjLmVuZCgpKTsKCWFwcGx5KGxpcy5iZWdpbigpLCBsaXMuZW5kKCksIHByZWRpY2F0ZSwgcGFzc2VkLCByZWplY3RlZCk7CgoJZm9yIChhdXRvIGUgOiBsaXMpIHN0ZDo6Y291dCA8PCBlIDw8ICIgIjsKCXN0ZDo6Y291dCA8PCAnXG4nOwp9