2015-02-05 4 views
4

Я ищу функцию в C++, чтобы вернуть суммирование по всем элементам массива, аналогично тому, что мы имеем в Matlab, т. Е. Sum (A), где A - массив. Я знаю, что можно просто сделать цикл for, но нет ли какой-либо функции, например, в «std ::»?C++: какие функции дают сумму массива?

+1

возможно дубликат [Сумма последовательных элементов в массиве C++] (http://stackoverflow.com/questions/13108622/sum-of-consecutive-elements-in-an-array-c) –

+1

@JeromeL Я довольно чертовски уверен, что это не дубликат (из этого конкретного Q, по крайней мере) –

ответ

12

Эта функция называется std::accumulate и находится в <numeric>.

Он работает как с контейнерами стандартной библиотеки (которые могут предоставить InputIterator, так что почти каждый из них) и массивы C-стиля - при условии, что вы используете std::begin и std::end. В противном случае container.begin()/end(), конечно, хорошо; обратитесь к примеру использования для получения дополнительной информации.

Следует отметить, что он снабжен двумя перегрузками, один из которых добавляет BinaryOperation. По умолчанию он равен std::plus в другой версии. На практике это означает, что он становится fold или reduce с других языков.


Пример использования массивов С-стиле, предоставляемые @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

+0

@BoBTFish Хм, ты прав. Поскольку 'accumulate' использует' std :: begin/end', он использует * свою * специализацию. Я проясню это. При этом специализации являются частью реализации, а не представленной подписи (что не делает мое первоначальное утверждение менее ошибочным). –

+1

'std :: accumulate' не использует' std :: begin/end', хотя вы, скорее всего, используете их при вызове. Разве вы не имеете в виду какую-то новую версию диапазона, которая пока не стандартная? – BoBTFish

Смежные вопросы