【发布时间】:2016-05-20 00:14:06
【问题描述】:
我需要将自定义func 成对应用于 STL 容器 -> 即:
// if c => {a,b,c,d,e,f,g}; // a,b,c,.. are just aliases for some object
my_algorithm(c.begin(),c.end(),[](auto a, auto b){ a + b }); // c++14
应该变成这样的:
temp1 = a + b;
temp2 = c + d;
temp3 = e + f;
temp4 = temp1 + temp2;
temp5 = temp3 + g;
result = temp4 + temp5;
(我确信这种算法有一个正确的名称,但我不知道这可能是什么)
我尝试过使用std::accumulate,我不确定它的实现是否由标准定义,但在我的情况下和我的编译器似乎可以解决这个问题(我认为这被称为成对求和,对吧?) :
temp1 = a + b;
temp2 = temp1 + c;
temp3 = temp2 + d;
// etc
这和我能得到的不太一样
auto temp = c[0];
std::for_each(c.begin()+1,c.end(),[&temp](auto a){temp + a); // c++14
我浏览了 STL 和 Boost,但没有找到相关的内容。有没有提供这种算法的库?如果没有,有什么好的 STL 兼容实现的想法吗?
编辑 只是补充一点,我对添加传统意义上的元素并不感兴趣——在这种情况下,顺序并不重要。我的函数将进行更复杂、加权的求和,如果以这种方式执行,将给出不同的结果。不过,我的问题更笼统。
【问题讨论】:
-
partial_sum() ?有点不清楚应该是什么结果
-
std::accumulate绝对是由标准定义的left fold。似乎您想自下而上构建一个平衡树,这是可能的,但在标准库 afaik 中是不可能的。 (“构建平衡树”有不同的算法,具体取决于您对“平衡”的定义,您仅通过一个示例提供;我认为这对于实现来说不够精确。) -
其实我从CUDA那里知道这种积累,那里叫“并行归约”
-
我认为以这种方式添加它们没有任何好处,除非您真的会使用多个线程?或者,如果您担心一些浮点问题,可能......我很难说出这种算法的普遍有用性,我认为我不希望在标准库中找到它跨度>
-
我对传统意义上的添加它们并不感兴趣。我在案例中传递的函数会进行更复杂、加权的求和,如果以这种方式执行,将会给出不同的结果。
标签: c++ algorithm c++11 stl c++14