将迭代器传递给lambda

时间:2017-07-05 07:17:25

标签: c++ c++11 lambda iterator

我想将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表达式。我怎样才能做到这一点?

3 个答案:

答案 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;
    });

似乎工作,虽然这是一个奇怪而模糊的解决方案。如果你问我原来的那个更清洁。我认为这个是滥用累积方法而不建议使用它。

Working example

答案 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;
    });
}

[live demo]

要将其移回c ++ 11,请使用boost::optional and non-generic lambdas