4

誰も理由を知っていますか

  vector<int> test(10);
  int a=0;

  for_each(test.begin(),test.end(),(_1+=var(a),++var(a)));

  for_each(test.begin(),test.end(),(cout << _1 << " "));
  cout << "\n"

与える:「0 1 2 3 4 5 6 7 8 9」

しかし

  transform(test.begin(),test.end(),test.begin(), (_1+=var(a),++var(a)));
  ...(as before)

与える:「1 2 3 4 5 6 7 8 9 10」

?

4

3 に答える 3

9

コンマ演算子は左から右に評価されるため、結果は

_1+=var(a), ++var(a)

は ++var(a) で、変換バージョンを使用して保存します。

  • for_each:

    _1 += var(a) が評価され、(ラムダ _1 を介して) シーケンスが更新され、次に ++var(a) が評価されますが、これはシーケンスには影響しません。

  • 変身:

    _1+=var(a) が評価され、シーケンスが更新されます (前と同じように)。次に ++var(a) が評価されます。これにより式全体の結果も得られ、それを使用してシーケンスが再び更新されます (変身)

于 2008-11-25T11:47:17.613 に答える
2

基本的に、 ではfor_each副作用のある関数を提供しますが、 ではtransform関数の戻り値を使用します。

あなたの場合、同じ関数を再利用します。operator +=たまたま戻り値があるので、これが変換の結果として使用されます。

于 2008-11-25T12:11:00.530 に答える
2

transform(test.begin(),test.end(),test.begin(), (_1+=var(a),++var(a)));

これは次のように変換されます

int doit(int & elem) {
    elem += a;
    return ++a;
}

for each elem : elem = doit(elem);

a=0 で開始すると、最初の実行で 1 になります。a を 10 回インクリメントしているので、最後の実行では 10 になります。


for_each(test.begin(),test.end(),(_1+=var(a),++var(a)));

これは次のように変換されます

void doit(int & elem) {
    elem += a;
    ++a;
}

for each elem : doit(elem);

a=0 から始めて、最初の実行で 0 を取得します。a を 10 回インクリメントしますが、インクリメントする直前に割り当てます。したがって、最後の数字は 9 です。

通常の関数への変換で、これら 2 つの機能が明確になったことを願っています。

于 2008-11-25T12:26:04.633 に答える