std :: transform中的[] const_iterator :: value_type是什么意思

Var*_*lta 5 c++ stl

具体来说这里是代码.第15行是做什么的(调用转换)?

有人可以解释为什么输出01234?另一方面,如果我在第15行将cb更改为++ cb,则输出01110.第15行的返回值是多少?

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <list>

int main()
{
    typedef std::list<int> L;
    L l(5);

    typedef L::const_iterator CI;
    CI cb = l.begin(), ce = l.end();
    typedef L::iterator I;
    I b = l.begin();
    std::transform(cb, --ce, ++b, [] (CI::value_type n) { return ++n; });
    std::copy(l.begin(), l.end(), std::ostream_iterator<CI::value_type>(std::cout));
    std::cout << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 2

在这份声明中

L l(5);
Run Code Online (Sandbox Code Playgroud)

创建了一个包含 5 个元素的列表,每个元素都用 0 初始化。

在这次通话中

std::transform(cb, --ce, ++b, [] (CI::value_type n) { return ++n; });
Run Code Online (Sandbox Code Playgroud)

cb指向列表的第一个元素。--ce求值后,递减运算符指向列表的最后一个元素。因此cb--ce设置列表元素的范围

[cb, --ce)
Run Code Online (Sandbox Code Playgroud)

其中括号表示--ce不包含在范围内。

++b评估增量后指向列表的第二个元素。所以你有了

  b 
  | 
 0 0 0 0 0
^       ^
|       |
cb      ce
Run Code Online (Sandbox Code Playgroud)

cb 指向的值(即列表的第一个元素的值)在 lambda 表达式中增加

[] (CI::value_type n) { return ++n; }
Run Code Online (Sandbox Code Playgroud)

并写入迭代器 b 指向的列表的第二个元素中。之后cbb在变换体内递增。

所以在第一次迭代之后列表看起来像

    b 
    | 
 0 1 0 0 0
  ^     ^
  |     |
  cb    ce
Run Code Online (Sandbox Code Playgroud)

现在cb指向列表的第二个元素。它的值在 lambda 表达式中递增,并写入 iterator 指向的第三个元素中b

      b 
      | 
 0 1 2 0 0
    ^   ^
    |   |
    cb  ce
Run Code Online (Sandbox Code Playgroud)

结果,您将得到该列表的值为 0、1、2、3、4。

如果您将像这样编写算法的调用

std::transform(++cb, --ce, ++b, [] (CI::value_type n) { return ++n; });
Run Code Online (Sandbox Code Playgroud)

使用++cbthencbb将指向相同的元素,并且该算法将简单地重写每个元素,并从列表的第二个元素开始使用其递增值,因为使用了 iterator ++cb。结果将为 0, 1, 1, 1, 0