在相同的输入迭代器范围内并排运行两个<algorithm>

pyo*_*yon 9 c++ algorithm iterator istream-iterator stl-algorithm

如果我想计算从a中检索到的一堆数字的总和std::istream,我可以执行以下操作:

// std::istream & is = ...
int total = std::accumulate(std::istream_iterator<int>(is),
                            std::istream_iterator<int>(),
                            0);
Run Code Online (Sandbox Code Playgroud)

但是,如果我想计算它们的平均值,我需要累积两个不同的结果:

  • 总和(std::accumulate)
  • 总数(std::distance)

有没有办法"合并"这两种算法并在迭代器范围的单次传递中"并排"运行它们?我想做的事情如下:

using std::placeholders;
int total, count;
std::tie(total, count) = merge_somehow(std::istream_iterator<int>(is),
                                       std::istream_iterator<int>(),
                                       std::bind(std::accumulate, _1, _2, 0),
                                       std::distance);
double average = (double)total / count;
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Ker*_* SB 11

Boost.Accumulators实现了这种单通道累积的现成解决方案.你创建一个累加器,比如求和,计数和平均值,填充它,然后在最后提取所有三个结果.


Dav*_*eas 9

您无法合并两种不同的算法进行交错.算法控制流量,您只能有一个流量.现在,在您的特定情况下,您可以模拟它:

int count = 0;
int total = std::accumulate(std::istream_iterator<int>(is),
                            std::istream_iterator<int>(),
                            0,
                            [&](int x, int y) { ++count; return x+y; });
Run Code Online (Sandbox Code Playgroud)