代码之家  ›  专栏  ›  技术社区  ›  Chris Huang-Leaver

为每个/变换拼图增加λ

  •  4
  • Chris Huang-Leaver  · 技术社区  · 17 年前

    有人知道为什么吗

      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"
    

    给出:“01 2 3 4 5 6 7 8 9”

    但是

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

    给出:“12345678910”

    3 回复  |  直到 17 年前
        1
  •  9
  •   Community Mohan Dere    6 年前

    逗号运算符从左到右求值,因此

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

    是++var(a),您将使用转换版本存储它。

    • 每一项:

      _计算1+=var(a),更新序列(通过lambda_1),然后计算++var(a),但这对序列没有影响。

    • _计算1+=var(a),更新序列(就像以前一样),然后计算++var(a),这也会给出整个表达式的结果,然后用于再次更新序列(通过转换)

        2
  •  2
  •   xtofl Adam Rosenfield    17 年前

    基本上,在 for_each transform

    在您的情况下,重用相同的函数。自从 operator += 碰巧有一个返回值,这是转换结果使用的返回值。

        3
  •  2
  •   Johannes Schaub - litb    17 年前

    (_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。


    对于每个变量(test.begin(),test.end(),(_1+=var(a),++var(a));

    这将转化为

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