We've had a look at std::transform() and std::count_if(), which are quite easy to implement both sequentially and in parallel. If we take another algorithm that is easily implemented sequentially, std::copy_if(), things get a lot harder to perform in parallel.
Sequentially, implementing std::copy_if() is as easy as this:
template <typename SrcIt, typename DstIt, typename Pred> auto copy_if(SrcIt first, SrcIt last, DstIt dst, Pred pred) { for(auto it = first; it != last; ++it) { if( pred(*it) ) { *dst = *it; ++dst; } } return dst; }
... and used like this:
auto vals = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; auto odd_vals = std::vector<int>(vals.size(), -1); auto is_odd = [](int v){ return (v % 2) == 1;}; ...