2

これは実際のコードです。ここでは、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では、キャプチャでラムダを使用できます。

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をキャプチャ( )します。コンパイラがラムダから構造を効果的に作成するため、これはソリューションと同じくらい効率的[&]であることに注意してください。

– Navazがコメントで述べたように、キャストは実際には不要です。さらに、Cスタイルのキャストは一般的に非推奨と見なされています。代わりにC++キャストを使用してください。

于 2012-06-11T11:40:29.570 に答える
4

std::accumulatewhich fromを使用し<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;
}

あなたはワンライナーを求めましたが、読みやすくするために、この自明ではないラムダに名前を付けることを好みます。

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 に答える