gpt4 book ai didi

c++ - 难以理解 std::transform 的行为

转载 作者:太空狗 更新时间:2023-10-29 20:27:05 24 4
gpt4 key购买 nike

考虑这个 -

#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <list>

int main()
{
typedef std::list<int> L;
L l(5);
typedef L::const_iterator CI;
typedef L::iterator I;
CI cb = l.begin(), ce = l.end();
I b = l.begin();
std::transform(cb, --ce, ++b, std::bind2nd(std::plus<CI::value_type>(), 1));
std::copy(l.begin(), l.end(), std::ostream_iterator<CI::value_type>(std::cout\
));
std::cout<<std::endl;
return 0;
}

根据我的说法,它的输出应该是 01111,因为转换将从列表的第一个元素迭代到“倒数第二个”元素,向每个元素添加 1 并从“第二个”元素覆盖到“最后一个”元素。

但令我惊讶的是输出是 01234

我错过了什么?我阅读了关于 cppreference 的转换文档

最佳答案

这是因为您将每个单独转换的结果存储到 source 容器的下一个元素中,因此转换函数的下一个输入将是前一个转换的输出(因为您如何定义输入和输出范围)。

换句话说,transform() 算法将处理容器的第一个元素 (0),向其添加 1,并将结果 (1) 存储为同一容器的第二个元素。然后,它将处理第二个元素,现在是 1;它将向其中添加 1,并将结果 (2) 存储为容器的第三个元素。依此类推,直到到达最后一次迭代。

如果你想获得输出 01111,你应该将转换的结果存储到一个不同的容器中(live example):

std::vector<int> out(l.size());
std::transform(cb, --ce, ++out.begin(),
// ^^^^^^^^^^^^^
std::bind2nd(std::plus<CI::value_type>(), 1));

或者使用不同的迭代策略,as suggested by DyP in the comments ( live example ):

 std::transform(++cb, ce, ++b, std::bind2nd(std::plus<CI::value_type>(), 1));

关于c++ - 难以理解 std::transform 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17321637/

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