C++ 将两个范围的值相加并将其放入第三个范围的算法

C++ 将两个范围的值相加并将其放入第三个范围的算法,c++,boost,c++11,stl,C++,Boost,C++11,Stl,我只是想知道是否有什么东西(在c++11或boost中)可以帮助我做这样的事情: std::vector<int> v1 = {1, 2, 3}; std::vector<int> v2 = {2, 5, 4}; std::list<int> res; algorithm(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(res), std::plus<int>()); std::

我只是想知道是否有什么东西(在c++11或boost中)可以帮助我做这样的事情:

std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {2, 5, 4};
std::list<int> res;
algorithm(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(res), std::plus<int>());
std::vector v1={1,2,3};
向量v2={2,5,4};
std::list res;
算法(v1.begin(),v1.end(),v2.begin(),v2.end(),back_inserter(res),std::plus());
结果当然应该是{3,7,7},其中std::plus可以是任何二进制函数,而不是std::plus


因此,如果有人有想法,请告诉我。

就是您要找的。

std::transform()就是您可能要找的。

您可以使用的5个参数重载。这需要一个二进制函子对两个范围的元素对进行操作:

std::transform(v1.begin(), 
               v1.end(), 
               v2.begin(), 
               back_inserter(res), 
               std::plus<int>());
std::transform(v1.begin(), v1.end(), v2.begin(), 背面插入器(res), std::plus());
为了好玩,我将指出
std::vector
std::transform
的替代方案。您可以改用
std::valarray

#include <valarray>
#include <iostream>

int main() { 
    std::valarray<int> a = {1, 2, 3};
    std::valarray<int> b = {2, 5, 4};

    std::valarray<int> c = a + b;    // look ma, no transform!

    for (int i=0; i<3; i++)
        std::cout << c[i] << "\t";
}

不幸的是,尽管将valarray添加到一起的代码简单明了,但valarray从未得到广泛的应用。因此,我们面临着这样一种相当奇怪的情况:即使是上面那种让我觉得非常干净、直观和可读的代码,也几乎可以说是模糊的,这仅仅是因为很少有人习惯于它。

哦,好吧,我不知道有一个版本有五个参数。我应该看起来更好,非常感谢大家。+1在已经有std函子的情况下抵制了使用lambda的诱惑。+1啊真的很酷,我不知道这是一个矢量化数组。我认为它也适用于所有其他算术运算符。啊,我也不知道它的存在,可能有一天会派上用场。@TemplateRex:是的,几乎所有的算术运算符都可以。您还可以执行类似于
valarray+int
的操作,向valarray的每个成员添加一个数字(例如,在上面的示例中,
c+1
将给出
4 8
)。
3       7       7