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

时间:2017-06-21 10:28:18

标签: c++ stl

我正在努力学习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;。

有什么想法吗?

1 个答案:

答案 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