Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用transform和lambdas isn';行不通_C++_C++11 - Fatal编程技术网

C++ 使用transform和lambdas isn';行不通

C++ 使用transform和lambdas isn';行不通,c++,c++11,C++,C++11,我发现了这些错误。为什么? 在/usr/include/c++/4.7/algorithm:63:0中包含的文件中, 来自项目cpp:2: /usr/include/c++/4.7/bits/stl_algo.h:在“_oiterstd::transform(_IIter,_IIter,_OIter,_OIter,_UnaryOperation,_UnaryOperation,_IIter=u gnu cxx::u正常迭代器>;_OIter=std::back_insert_迭代器>;_Una

我发现了这些错误。为什么?

在/usr/include/c++/4.7/algorithm:63:0中包含的文件中, 来自项目cpp:2: /usr/include/c++/4.7/bits/stl_algo.h:在“_oiterstd::transform(_IIter,_IIter,_OIter,_OIter,_UnaryOperation,_UnaryOperation,_IIter=u gnu cxx::u正常迭代器>;_OIter=std::back_insert_迭代器>;_UnaryOperation=main():]”的实例化中: 程序cpp:10:98:从这里开始需要 /usr/include/c++/4.7/bits/stl_algo.h:4951:2:错误:调用'(main():)(int&)不匹配 项目cpp:10:64:注:候选人为: 在/usr/include/c++/4.7/algorithm:63:0中包含的文件中, 来自项目cpp:2: /usr/include/c++/4.7/bits/stl_algo.h:4951:2:note:int(*)(int,int) /usr/include/c++/4.7/bits/stl_algo.h:4951:2:注意:候选者需要3个参数,提供2个 程序cpp:10:79:注意:main():: prog.cpp:10:79:注:候选者需要2个参数,提供1个参数

#包括
#包括
int main()
{
std::向量v{1,2,3,4,5,6};
std::向量r;
std::transform(v.begin(),v.end(),std::back_插入器(r),[](inta,intb){返回a+b;});
}

该代码应该将每对数字相加,并将其放入
r
向量中,但它不起作用。这是为什么?

您选择了在单个范围内工作的重载,因此希望提供一元函子作为最后一个参数

如果您希望处理两个范围(可能是同一范围的两个“副本”),那么您应该:

std::transform(v.begin(), v.end(), v.begin(), 
//                                 ^^^^^^^^^
    std::back_inserter(r), [] (int a, int b) { return a + b; });
下面是完整的代码:

#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v {1, 2, 3, 4, 5, 6};
    std::vector<int> r;

    std::transform(v.begin(), v.end(), v.begin(),
        std::back_inserter(r), [] (int a, int b) { return a + b; });
}
相反,如果您希望在使用类似变换的方法时,对每对连续元素执行求和,并将结果存储在
r
向量中,那么您可以求助于Boost.Range,并编写如下内容:

#include <boost/range.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>

// ...

namespace rng = boost::adaptors;

// This will fill r with values { 3, 7, 11 }
boost::transform(
    v | rng::strided(2),
    std::make_pair(v.begin() + 1, v.end()) | rng::strided(2),
    std::back_inserter(r),
    [] (int a, int b) { return a + b; });

不确定这是否是OP真正想要的,因为这相当于一元数版本的lambda
[](int a){return 2*a;}
“每对数字”听起来更像是OP想要枚举所有成对的数字(这对
转换来说并不是一项真正的工作)。@KonradRudolph:重新阅读答案后,我想你是对的。将再次编辑,你拥有的一切都很好。谢谢。@MemyselfandI:好吧,但我所展示的并不是每个连续的元素对的总和。这就是你想做的吗?也许你可以考虑使用case@MemyselfandI:我添加了一个使用Boost.Range的示例,该示例与我认为您试图使用
transform()
所做的一样(但使用
Boost::transform()
而不是
std::transform()
std::transform(v.begin(), v.end(), 
    std::back_inserter(r), [] (int a) { return a * 2; });
#include <boost/range.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>

// ...

namespace rng = boost::adaptors;

// This will fill r with values { 3, 7, 11 }
boost::transform(
    v | rng::strided(2),
    std::make_pair(v.begin() + 1, v.end()) | rng::strided(2),
    std::back_inserter(r),
    [] (int a, int b) { return a + b; });
boost::transform(
    v | rng::strided(2),
    v | rng::sliced(1, v.size()) | rng::strided(2),
    std::back_inserter(r),
    [] (int a, int b) { return a + b; });