特别是这里的代码。第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;
}

最佳答案

在此声明中

L l(5);

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

在这次通话中
std::transform(cb, --ce, ++b, [] (CI::value_type n) { return ++n; });
cb指向列表的第一个元素。求值后的--ce减量运算符指向列表的最后一个元素。
因此cb--ce设置了列表元素的范围
[cb, --ce)

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

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

在lambda表达式中,由cb指向的值(即列表的第一个元素的值)增加了
[] (CI::value_type n) { return ++n; }

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

因此,在第一次迭代之后,列表看起来像
    b
    |
 0 1 0 0 0
  ^     ^
  |     |
  cb    ce

现在,cb指向列表的第二个元素。它的值在lambda表达式中递增,并写入迭代器b指向的第三个元素中。
      b
      |
 0 1 2 0 0
    ^   ^
    |   |
    cb  ce

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

如果您将编写算法调用,例如
std::transform(++cb, --ce, ++b, [] (CI::value_type n) { return ++n; });

如果使用++cb,那么cbb将指向同一元素,并且该算法将简单地重写每个元素,其值从列表的第二个元素开始,因为使用了迭代器++cb
结果将是0、1、1、1、0

关于c++ - std::transform中的[] const_iterator::value_type是什么意思,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28904601/

10-12 20:41