【发布时间】:2021-10-29 19:22:28
【问题描述】:
在 C++ 中,有一个函数 std::partial_sum 来计算前缀和。代码
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
int main() {
std::vector<int> a = {1, 2, 3, 4, 5};
std::partial_sum(a.begin(), a.end(), a.begin());
return 0;
}
将覆盖 a 到 1 3 6 10 15,这是预期的。
但是,在大多数情况下,我想使用前缀 sum,我希望前面有一个 0 来表示“空和”,以便我可以使用 a[2] - a[0] 来查询前两个元素的总和。 (这允许我使用一个简单的嵌套 for 循环来查找所有子数组的总和)。有没有办法用std::partial_sum 函数来实现它?我不知道这是否可能,因为输出大小将是输入大小 + 1。
注意:我不是在寻找事先改变a 的内容或类型的方法。
如果a 的大小是一个问题:
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
int main() {
std::vector<int> a = {1, 2, 3, 4, 5, -1};
std::partial_sum(a.begin(), a.end() - 1, a.begin());
return 0;
}
这样的事情也对我有用。
【问题讨论】:
-
"这样我就可以使用 a[2] - a[0]" 那么你肯定会想要别的东西作为你的输出迭代器......
-
@KarlKnechtel 假设我想覆盖
a的内容 -
你可以输出到不同的容器就好了(并且因为你可以,不同的输出大小不是问题)。但是,您的原始代码版本使用了
ostream_iterator,这不会给您留下可以轻松使用[]的东西。无论如何,我能想到的最简单的解决方法是先将0值输出到迭代器,然后再将其传递给partial_sum。std::accumulate允许您指定一个初始值,但它只计算最终结果,而不是给出所有部分结果。 -
@KarlKnechtel 明白了。现在如果我想用
{0, 1, 3, 6, 10, 15}覆盖a而没有另一个容器怎么办?那有可能吗? -
我认为这不能正常工作(即使在
std::vector上使用insert_iterator),因为例如初始0将覆盖您要添加的第一个值,然后才能将其添加到运行总计中。
标签: c++ std stdvector prefix-sum