我正在努力学习C ++ 11& STL,我无法理解这段代码:
#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;
}
最后的数组是0,1,2,3,4,我预计它是0,1,1,1,0
1&GT;为什么不是最后一次跳过因为&#34; - ce&#34;?我已经阅读了std :: transform的实现,但我仍然不明白为什么它不会跳过最后一个:http://llvm.org/svn/llvm-project/libcxx/trunk/include/algorithm
2 - ;怎么可能最后的数组是0,1,2,3,4?我不知道++ n是如何加起来的2,我认为,因为在值为0,0,0,0,0之前,它将每增加一个零,而++导致0,1,1 ,1,我看到第一个被跳过,因为&#34; ++ b&#34;。
有什么想法吗?
答案 0 :(得分:4)
我认为理解这一点的最简单方法是编写循环的一些迭代:
第一次迭代:
0 1 0 0 0
^ input
^ output
第二次迭代:
0 1 2 0 0
^ input
^ output
第3次迭代:
0 1 2 3 0
^ input
^ output
等等。
可以看到输入旁边的元素增加了。
另请注意,输入范围的开始和结束之间的std::distance()
(它不包括最后一个)与输出范围完全相同(4),即从第二个元素到最后一个元素(4) )。
举例说明:
输入:索引0 1 2 3
输出:索引1 2 3 4