Implementing parallel std::copy_if

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;}; ...

Get C++ High Performance now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.