合并多个均匀大小的向量

Merge multiple evensized vectors

我有 n 个偶数大小的 std::vector。让我们假设 n=3 和 size = 4:

std::vector<int> a {1,2,3,4};
std::vector<int> b {2,2,2,2};
std::vector<int> c {3,3,3,3};
std::vector<std::vector<int>> combinedVectors {a,b,c};

我想检索一个大小为 4 的向量,它的第 i 个成员是所有向量第 i 个成员的总和。 在例子中

std::vector<int> x{6,7,8,9};

构建向量的最佳通用方法是什么 x?请在您的回答中坚持使用 cpp17 标准。

通过最好的方式,我想坚持使用 <algorithm> 而不是使用循环。

如果你真的确定要使用algorithm库,你可以这样:

std::vector<int> tmp;
std::vector<int> result;

std::transform(
    std::begin(a), std::end(a),
    std::begin(b),
    std::back_inserter(tmp),
    [](int a, int b) { return a + b; }
);

std::transform(
    std::begin(c), std::end(c),
    std::begin(tmp),
    std::back_inserter(result),
    [](int a, int b) { return a + b; }
);

缺点是您需要一个临时的 std::vector

不存在将一系列范围作为参数的算法(好吧,它们确实如此,但马虎地说算法适用于元素而不是元素的元素)。 std::ranges 可能会有所帮助,但如果您想坚持使用 C++17,则只能使用现有算法并进行一些扭曲或编写您自己的算法。

#include <vector>
#include <iostream>

template <typename IT,typename...Args> 
void copy_sum(IT begin, IT end, IT to, Args... others) {
    for (; begin != end; ++begin,++to){
        *to = *begin + (*others++ + ...);
    }
}


int main(){
    std::vector<int> a {1,2,3,4};
    std::vector<int> b {2,2,2,2};
    std::vector<int> c {3,3,3,3};
    //std::vector<std::vector<int>> combinedVectors {a,b,c};

    std::vector<int> result(a.size());
    copy_sum(a.begin(),a.end(),result.begin(),b.begin(),c.begin());

    for (auto e : result) std::cout << e << " ";    
}

请注意,我没有使用 combinedVectors。如果你想保持通用,那么传递迭代器而不是容器。尽管如此,上面的内容可以从一个帮助器中受益,该帮助器将 beginend 带到 combinedVectors 中的一系列元素并将它们的 beginend 转发到 copy_sum.

然而,这并不是我所说的 "nicest",只要您继续使用 C++17,一个简单的循环在可读性方面可能是无与伦比的。