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

std::accumulate

Материал из cppreference.com

<metanoindex/>

 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
<tbody> </tbody>
Определено в заголовочном файле <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

См. также

вычисляет различия между соседними элементами в диапазоне
(шаблон функции) [править]
вычисляет скалярное произведение двух диапазонов элементов
(шаблон функции) [править]
вычисляет частичную сумму диапазона элементов
(шаблон функции) [править]