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

std::accumulate

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

 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Defined in header <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.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
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 и 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

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

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

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

(шаблон функции) [править]