将两个范围的值相加并将它们放入第三个范围的算法

algorithm to add values of two ranges and place them into a third one

本文关键字:范围 三个 算法 两个      更新时间:2023-10-16

我只是想知道是否有任何东西(无论是在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>());

结果当然应该是{3,7,7},而std::plus可以是任何binary_function。

如果有人有什么想法,请告诉我。

为了好玩,我将指出std::vectorstd::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";
}
结果:

3       7       7

不幸的是,尽管将valarray添加在一起的代码简单而干净,但valarray从未得到过广泛的普及。这样,我们就会遇到这种奇怪的情况,即使像上面这样的代码,在我看来是非常干净、直接和可读的,但仍然几乎被认为是混淆的,仅仅是因为很少有人习惯它。

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

std::transform(v1.begin(), 
               v1.end(), 
               v2.begin(), 
               back_inserter(res), 
               std::plus<int>());

std::transform就是你要找的。

std::transform (http://en.cppreference.com/w/cpp/algorithm/transform)可能就是您要找的。