这是实际的代码。我在调用for_each来执行sum中显示的函数。这可以简化为在for_each语句本身内部编写函数吗?
int S;
struct sum
{
sum(int& v): value(v){}
void operator()(int data)const {value+=(int)((data+(data%S==0?0:S))/S)+2;}
int& value;
};
int main()
{
int cnt=0;
S=5;
for_each(flights.begin(),flights.end(),sum(cnt));
cout<<cnt-2;
return 0;
}
答案 0 :(得分:9)
在C ++ 11中,你可以使用lambdas和capture:
int main()
{
int cnt = 0;
S = 5;
for_each(
flights.begin(), flights.end(),
[&] (int data) {
cnt += (data + (data % S == 0 ? 0 : S)) / S + 2;
});
cout << cnt - 2;
return 0;
}
这样做的方法是:你有一个匿名函数采用int
参数,该参数通过引用捕获([&]
)周围的上下文。请注意,这是与解决方案一样高效,因为编译器会为您有效地为lambda创建结构。
- 正如Navaz在评论中指出的那样,演员实际上是不必要的。此外,C风格的强制转换通常被视为已弃用 - 而是使用C ++强制转换。
答案 1 :(得分:4)
您可以使用std::accumulate
中的<numeric>
来完美表达您构建总和的意图。
int main()
{
int flights[] = {1, 2, 3};
int S = 5;
std::cout << std::accumulate(
begin(flights), end(flights), 0,
[S] (int sum, int data) { return sum + (int)((data+(data%S==0?0:S))/S)+2; })
- 2;
}
虽然你要求一个班轮,但我更喜欢给这个非平凡的lambda一个名字,以提高可读性。
int main()
{
int flights[] = {1, 2, 3};
auto theFooBarSum = [] (int sum, int data)
{ return sum + (int)((data+(data%5==0?0:5))/5)+2; };
int initialValue = 0;
std::cout << std::accumulate(
begin(flights), end(flights), initialValue , theFooBarSum) - 2;
}