具体来说这里是代码.第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)
在这份声明中
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 指向的列表的第二个元素中。之后cb和b在变换体内递增。
所以在第一次迭代之后列表看起来像
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)
使用++cbthencb和b将指向相同的元素,并且该算法将简单地重写每个元素,并从列表的第二个元素开始使用其递增值,因为使用了 iterator ++cb。结果将为 0, 1, 1, 1, 0
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |