将两个范围的值相加并将它们放入第三个范围的算法
algorithm to add values of two ranges and place them into a third one
我只是想知道是否有任何东西(无论是在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::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";
}
结果: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)可能就是您要找的。
相关文章:
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 我有三个 getline,但是一旦编译,输入就太多了
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 有没有更好的方法对C++中的三个整数进行排序?
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 为什么 getch 在按下函数或箭头键时返回三个值?
- 使用三个数字比较器进行排序
- 我想在C++代码中比较这三个术语
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 我该如何编码,使计算机知道两个名称条目和三个名称条目之间的区别
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 如何通过通用引用或std::forward将这三个c++模板函数合并为一个
- 首先处理第二个和第三个堆与第一个和第二个堆之间的逻辑差异
- 使用星号在条形图中输出负值,以表示三个值的范围
- 将两个范围的值相加并将它们放入第三个范围的算法
- 逆转三个连续子范围 [A,B,C] -> [C,B,A] 的有效方法
- 如果存在三个变量,则使用范围解析操作符