2

まだ非常に高速に実行される古い C コードがいくつかあります。それが行うことの1つは、条件が保持される配列の一部を保存することです(「マスクされた」コピー)

したがって、Cコードは次のとおりです。

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

...   

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

このコードを「近代化」していたとき、インデックス カウンターを使用する必要のない反復子を使用して、C++11 でこれを行う方法があると考えました。std::for_eachしかし、またはでこれを行うより短い方法はないようですstd::copy。これを C++11 でもっと簡潔に書く方法はありますか? それとも、探すのをやめて古いコードを残しておくべきですか?

4

2 に答える 2

1

oriループのみをモダナイズし、データを維持したい場合はmsk、@YuxiuLi のソリューションを使用してください。mskデータの生成も最新化する場合std::copy_ifは、述語 (ここでは負の数のみを保持するラムダ) を使用して、要素を直接フィルター処理できます。

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>

int main()
{
    auto ori = std::vector<double> { 0.1, -1.2, 2.4, 3.4, -7.1 };
    std::vector<double> out;

    std::copy_if(begin(ori), end(ori), std::back_inserter(out), [&](double d) { return d < 0.0; });
    std::copy(begin(out), end(out), std::ostream_iterator<double>(std::cout, ","));
}

ライブの例。これにより、 の中間ストレージが節約されmskます。

于 2013-10-18T21:26:54.223 に答える