std::transform 操作到 --end() 和奇怪的输出

std::transform operating till --end() and strange output

本文关键字:输出 transform 操作 --end std      更新时间:2023-10-16

我正在尝试学习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