2

这是实际代码。这里我调用 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;
}
4

2 回答 2

9

在 C++11 中,您可以使用带有捕获的 lambda:

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++ 强制转换。

于 2012-06-11T11:40:29.570 回答
4

您可以使用std::accumulatefrom <numeric>which 完美地表达您建立总和的意图。

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;
}
于 2012-06-11T11:47:02.957 回答