特别是这里的代码。第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指向的列表的第二个元素中。之后,
cb
和b
在转换主体内递增。因此,在第一次迭代之后,列表看起来像
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
,那么cb
和b
将指向同一元素,并且该算法将简单地重写每个元素,其值从列表的第二个元素开始,因为使用了迭代器++cb
。结果将是0、1、1、1、0
关于c++ - std::transform中的[] const_iterator::value_type是什么意思,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28904601/