假设我想两个向量加a和b成矢量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()添加超过两个向量的情况,即如果我想将向量相加a,b并c放入 d 中。然后我回到 for 循环,或者我必须使用两轮std::transform(). 或者有没有一种方法可以使用单个std::transform()操作(或类似的东西)同时对两个以上的输入向量进行操作?
确实,在标准库中这是不可能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)