多于两个向量的 std::transform

arc*_*pus 5 c++ vector std

假设我想两个向量加ab成矢量c

std::vector<double> a, b, c;
//Fill/Initialize vectors
Run Code Online (Sandbox Code Playgroud)

我可以使用std::transform()或简单的for循环:

//std::transform
std::transform(a.begin(),
               a.end(),
               b.begin(),
               c.begin(),
               [](const auto &a_val, const auto &b_val){
                  return a_val + b_val;
               });
//Loop
for(size_t i = 0; i < a.size(); ++i){
    c[i] = a[i] + b[i];
}
Run Code Online (Sandbox Code Playgroud)

通常,std::transform()推荐使用与for-loop 相比较。不幸的是,据我所知,我无法使用类似的方法来std::transform()添加超过两个向量的情况,即如果我想将向量相加abc放入 d 中。然后我回到 for 循环,或者我必须使用两轮std::transform(). 或者有没有一种方法可以使用单个std::transform()操作(或类似的东西)同时对两个以上的输入向量进行操作?

bar*_*top 6

确实,在标准库中这是不可能std::transform超过 2 个向量的。但是使用range-v3您可以使用任意数量的向量来实现zip

#include <include/range/v3/view/zip.hpp>

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

    std::vector<int> res;
    auto r = ranges::views::zip(a, b, c, d);
    std::transform(
        r.begin(),
        r.end(),
        std::back_inserter(res),
        [](const auto& tup) { return std::get<0>(tup); }
    );
}
Run Code Online (Sandbox Code Playgroud)