我想将lambda表达式用于以下代码,
long long noOfways =0;
auto dist =0;
for(auto iter = noChocolets.begin()+1;iter!=noChocolets.end();iter++)
{
dist+=*(iter)-*(iter-1);
noOfways+= minOper(dist);
}
我特别想将 for loop 转换为lambda表达式。我怎样才能做到这一点?
答案 0 :(得分:3)
尝试使用std :: accumulate。
accumulate(noChocolets.begin()+1, noChocolets.end(), noChocolets[0],
[&](long long left, long long right){
dist += right-left;
noOfways += minOper(dist);
return right;
});
似乎工作,虽然这是一个奇怪而模糊的解决方案。如果你问我原来的那个更清洁。我认为这个是滥用累积方法而不建议使用它。
答案 1 :(得分:0)
您可以抽象它,以防您需要在相同的块中重复使用
auto f = [](auto& itercollection)
{
for(auto iter = itercollection.begin()+1;iter!=itercollection.end();iter++)
{
dist+=*(iter)-*(iter-1);
noOfways+= minOper(dist);
}
}
然后调用它:
f(noChocolets)
f(noChocolets2)
f(noChocolets3)
答案 2 :(得分:0)
迭代器的使用与基于范围的循环/ lambda和std::for_each
等效,因此始终有一种方法可以将其中一种方法替换为另一种方法。但正如评论中所提到的,迭代器方法具有清晰的优点......示例c ++ 17解决方案:
#include <vector>
#include <algorithm>
#include <optional>
int main() {
std::vector<int> v {1, 2, 3, 4};
auto dist =0;
long long noOfways =0;
auto minOper = [](auto e) {return e;};
std::optional<decltype(v)::value_type> prev {};
std::for_each(v.begin(), v.end(), [&](auto e) {
if (prev.has_value()) {
dist += e - prev.value();
noOfways+= minOper(dist);
}
prev = e;
});
}
要将其移回c ++ 11,请使用boost::optional and non-generic lambdas。