gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:39:51 25 4
gpt4 key购买 nike

我正在尝试学习 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> 为什么没有因为“--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++ - std::transform 操作直到 --end() 和奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44673548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com