std::transform 操作到 --end() 和奇怪的输出
std::transform operating till --end() and strange output
我正在尝试学习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、1、0
1> 为什么最后一个没有因为"--ce"而跳过?我已经阅读了 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、0。我看到第一个因为"++b"而被跳过。
有什么想法吗?
我认为理解这一点的最简单方法是编写循环的一些迭代:
第一次迭代:
0 1 0 0 0
^ input
^ output
第二次迭代:
0 1 2 0 0
^ input
^ output
第三次迭代:
0 1 2 3 0
^ input
^ output
等等。
然后可以看到输入旁边的元素递增。
另请注意,输入范围的开始和结束之间的std::distance()
(不包括最后一个(与输出范围完全相同(4(,输出范围是从第二个元素到最后一个元素(4(。
举例说明:
输入:索引 0 1 2 3
输出:索引 1 2 3 4
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- std::transform 操作到 --end() 和奇怪的输出
- std::transform 中的输入迭代器和输出迭代器来自同一个容器是否安全?
- 如何更改Media Foundation Transform输出帧(视频)的大小