2

我有一些运行速度非常快的旧 C 代码。它所做的一件事是存储条件成立的数组部分(“屏蔽”副本)

所以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_eachor 甚至std::copy. 有没有办法在 C++11 中更简洁地写出来?还是我应该停止查找并保留旧代码?

4

2 回答 2

1

如果您只想对循环进行现代化改造并保留ori数据msk,请使用@YuxiuLi 的解决方案。如果您还想现代化msk数据的生成,您可以使用std::copy_if谓词(此处:仅保留负数的 lambda)来直接过滤元素。

#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 回答
1

我想你正在寻找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]; });
于 2013-10-14T18:11:04.037 回答