Search code examples
c++11vectorforeachcopymask

use of for_each in a partial copy


I have some old C code that still runs very fast. One of the things it does is store the part of an array for which a condition holds (a 'masked' copy)

So the C code is:

int    *msk;
int     msk_size;
double *ori;
double  out[msk_size];    

...   

for ( int i=0; i<msk_size; i++ )
    out[i] = ori[msk[i]];

When I was 'modernising' this code, I figured that there would be a way to do this in C++11 with iterators that don't need to use index counters. But there does not seem to be a shorter way to do this with std::for_each or even std::copy. Is there a way to write this up more concisely in C++11? Or should I stop looking and leave the old code in?


Solution

  • I think you are looking for std::transfrom.

    std::array<int, msk_size> msk;
    std::array<double, msk_size> out;
    double *ori;
    
    ....
    
    std::transform(std::begin(msk), std::end(msk), 
                   std::begin(out), 
                   [&](int i) { return ori[i]; });