Пространства имён
Варианты
Действия

std::accumulate

Материал из cppreference.com
< cpp‎ | algorithm

 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
iota(C++11)
accumulate
inner_product
Библиотека C
 
Определено в заголовочном файле <numeric>
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );
(1)
template< class InputIt, class T, class BinaryOperation >

T accumulate( InputIt first, InputIt last, T init,

              BinaryOperation op );
(2)

Функция accumulate считает сумму значений val и всех элементов в диапазоне [first, last). The first version uses operator+ to sum up the elements, the second version uses the given binary function op.

Содержание

[править] Параметры

first, last -
диапазон элементов в сумме
Оригинал:
the range of elements to sum
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
init - initial value of the sum
op - binary operation function object that will be applied.

The signature of the function should be equivalent to the following:

 Ret fun(const Type1 &a, const Type2 &b);

The signature does not need to have const &.
Тип Type1 должен быть таков, что объект типа T может быть неявно преобразован в Type1. Тип Type2 должен быть таков, что объект типа InputIt может быть разыменован и затем неявно преобразован в Type2. Тип Ret должен быть таков, что объекту типа T можно присвоить значение типа Ret. ​

Требования к типам
-
InputIt должен соответствовать требованиям InputIterator.
-
T должен соответствовать требованиям CopyAssignable and CopyConstructible.

[править] Возвращаемое значение

The sum of the given value and elements in the given range.

[править] Возможная реализация

Первый вариант
template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T value)
{
    for (; first != last; ++first) {
        value = value + *first;
    }
    return value;
}
Второй вариант
template<class InputIt, class T, class BinaryOperation>
T accumulate(InputIt first, InputIt last, T value,
             BinaryOperation op)
{
    for (; first != last; ++first) {
        value = op(value, *first);
    }
    return value;
}

[править] Пример

#include <iostream>
#include <vector>
#include <numeric>
#include <string>
 
int multiply(int x, int y)
{
    return x*y;
}
 
std::string magic_function(std::string res, int x)
{
    return res += (x > 5) ? "b" : "s";
}
 
int main()
{
    std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
 
    int sum = std::accumulate(v.begin(), v.end(), 0);
    int product = std::accumulate(v.begin(), v.end(), 1, multiply);
    std::string magic = std::accumulate(v.begin(), v.end(), std::string(),
                                        magic_function);
 
    std::cout << sum << '\n'
              << product << '\n'
              << magic << '\n';
}

Вывод:

55
3628800
sssssbbbbb

[править] См. также

вычисляет разницу между соседними элементами в диапазоне
(шаблон функции) [edit]
вычисляет скалярное произведение двух диапазонах элементы
Оригинал:
computes the inner product of two ranges of elements
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]
вычисляет частичную сумму ряда элементов
Оригинал:
computes the partial sum of a range of elements
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]