2015-02-05 35 views
4

我在C++中尋找一個函數,以返回數組中所有元素的求和,類似於我們在Matlab中的求和,即求和(A),其中A是一個數組。 我知道可以簡單地做一個for循環,但沒有任何功能,例如在「std ::」?C++:哪些函數給出了數組的總和?

+1

可能重複的[在一個數組連續元素的總和,C++](http://stackoverflow.com/questions/13108622/sum-of-consecutive-elements-in-an-array-c) – 2015-02-05 14:42:26

+1

@JeromeL我很確定它不是重複的(至少是那個特定的Q) – 2015-02-05 14:43:09

回答

12

該功能被稱爲std::accumulate,並駐留在<numeric>

它可以與標準庫容器(能夠提供InputIterator,幾乎所有其中一個)和C風格的陣列一起使用 - 前提是您使用的是std::beginstd::end。否則container.begin()/end()當然是好的;請參閱示例使用以獲取更多信息。

有一點要注意的是,它提供了兩個重載,其中一個增加了一個BinaryOperation。它在其他版本中默認爲std::plus。這在實踐中意味着它變成了其他語言的foldreduce


使用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'; 
} 
+0

「專門用於C風格的陣列」? [哪兒?](http://en.cppreference.com/w/cpp/algorithm/accumulate)。你的意思是'std :: begin'和'std :: end'是? – BoBTFish 2015-02-05 14:52:01

+0

@BoBTFish嗯,你是對的。由於'accumulate'使用'std :: begin/end',它使用*它的特殊性。我會澄清這一點。話雖如此,專業化是實施的一部分,而不是簽名(這並不會使我的原始聲明更加錯誤)。 – 2015-02-05 14:53:07

+1

'std :: accumulate'不使用'std :: begin/end',儘管你很可能在調用它時使用它們。除非你指的是一些即將到來的範圍版本,這是不是標準呢? – BoBTFish 2015-02-05 14:54:26