【发布时间】:2015-02-05 14:40:20
【问题描述】:
我在 C++ 中寻找一个函数,用于返回数组所有元素的总和,类似于我们在 Matlab 中的函数,即 sum(A),其中 A 是一个数组。 我知道可以简单地做一个 for 循环,但没有任何函数这样做,例如在“std::”中?
【问题讨论】:
-
@JeromeL 我非常确定它不是重复的(至少是那个特定的 Q)
我在 C++ 中寻找一个函数,用于返回数组所有元素的总和,类似于我们在 Matlab 中的函数,即 sum(A),其中 A 是一个数组。 我知道可以简单地做一个 for 循环,但没有任何函数这样做,例如在“std::”中?
【问题讨论】:
该函数名为std::accumulate,位于<numeric>。
它适用于标准库容器(能够提供InputIterator,几乎每个容器)和 C 样式数组 - 只要您使用 std::begin 和 std::end。否则container.begin()/end()当然可以;有关更多信息,请参阅示例用法。
需要注意的是,它提供了两个重载,其中一个添加了BinaryOperation。在其他版本中默认为std::plus。这在实践中意味着它变成了其他语言的fold 或reduce。
使用 C 样式数组的示例,由 @BoBTFish - ideone link 提供。
#include <iostream>
#include <iterator>
#include <numeric>
int main()
{
int nums[] = {1,5,3,2,7,8,100,3};
std::cout
<< std::accumulate(std::begin(nums),
std::end(nums),
0)
<< '\n';
}
【讨论】:
std::begin 和std::end 是吗?
accumulate 使用std::begin/end,它使用its 特化。我会澄清这一点。话虽如此,专业化是实现的一部分,而不是提供的签名(这并没有使我的原始陈述减少错误)。
std::accumulate 不使用std::begin/end,尽管您很可能在调用它时使用它们。除非您指的是一些即将推出的系列版本,这还不是标准的?