【发布时间】:2017-07-12 08:02:00
【问题描述】:
我想用 std::transform 替换 for 循环。由于我对算法和 lambda 函数的经验很少,我想知道这是否是正确的方法
原始代码
for (size_t i=0; i < dataPhase.size(); ++i)
{
dataPhase[i] = fmod(dataPhase[i], pi*1.00001);
}
std::transform 与 lambda
std::transform(dataPhase.begin(), dataPhase.end(), dataPhase.begin(),
[](double v){return fmod(v, pi*1.00001); }
);
我需要在这里抓拍吗?
在这种使用索引的情况下,我可以做些什么来替换 for 循环,如下代码所示:
const int halfsize = int(length/2);
for (size_t i=0; i < length; ++i)
{
axis[i] = int(i) - halfsize;
}
编辑: 我想扩展问题(如果允许)。
在这种情况下是否可以用不同的东西替换 for 循环
for(std::vector<complex<double> >::size_type i = 0; i != data.size(); i++) {
dataAmplitude[i] = abs(data[i]);
dataPhase[i] = arg(data[i]);
}
这里没有修改原始向量,而是将其值用于两个不同的向量。
【问题讨论】:
-
如果你得到的结果,它可能是正确的。你观察什么?算法适用于迭代器而不是索引。将第二个 sn-p 转换为使用算法是没有意义的,因为在这种情况下,带有索引的循环更具可读性
-
std::transform也可用于没有明确索引的类型(如链表等)。只要前两个参数满足“输入迭代器”类别,第三个参数满足“输出迭代器”要求。因此,函数中没有(概念)索引。 -
@Matthias Pospiech 在尝试删除所有 for 循环之前,也许您可以看看我的评论 #1.... 大多数情况下,这会阻止您使用 OpenMP。
标签: c++ algorithm c++11 lambda