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

std::partial_sum

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

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

OutputIt partial_sum( InputIt first, InputIt last, OutputIt d_first,

                      BinaryOperation op );
(2)
Вычисляет частичных сумм элементов в поддиапазонов диапазона [first, last) и записывает их в диапазоне начиная с d_first. Первый вариант используется operator+ подвести итоги элементы, вторая версия использует данную функцию двоичного op.
Original:
Computes the partial sums of the elements in the subranges of the range [first, last) and writes them to the range beginning at d_first. The first version uses operator+ to sum up the elements, the second version uses the given binary function op.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Эквивалентная операция
Original:
Equivalent operation:
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
*(d_first)   = *first;
*(d_first+1) = *first + *(first+1);
*(d_first+2) = *first + *(first+1) + *(first+2);
*(d_first+3) = *first + *(first+1) + *(first+2) + *(first+3);
...

Содержание

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

first, last -
диапазон элементов в сумме
Original:
the range of elements to sum
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
d_first -
В начале назначения диапазона
Original:
the beginning of the destination range
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
op - применяемый функциональный объект, задающий бинарную операцию.

Сигнатура функции должна быть эквивалента следующей:

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

В сигнатуре не обязательно наличие const &.
Тип  Type1 должен быть таков, что объект типа iterator_traits<InputIt>::value_type может быть неявно преобразован в  Type1. Тип  Type2 должен быть таков, что объект типа InputIt может быть разыменован и затем неявно преобразован в  Type2. Тип  Ret должен быть таков, что объекту типа iterator_traits<InputIt>::value_type можно присвоить значение типа  Ret. ​

Требования, накладываемые на типы
-
InputIt должен соответствовать требованиям InputIterator.
-
OutputIt должен соответствовать требованиям OutputIterator.

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

Итератор на элемент после последнего элемента написано.
Original:
Iterator to the element past the last element written.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[править] Сложность

Именно (last - first) - 1 применения бинарной операции
Original:
Exactly (last - first) - 1 applications of the binary operation
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

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

Первый вариант
template<class InputIt, class OutputIt>
OutputIt partial_sum(InputIt first, InputIt last,
                           OutputIt d_first)
{
    return std::partial_sum(first, last, d_first,
                            std::plus<InputIt, InputIt>());
}
Второй вариант
template<class InputIt, class OutputIt, class BinaryOperator>
OutputIt partial_sum(InputIt first, InputIt last,
                           OutputIt d_first, BinaryOperation op)
{
    if (first == last) return d_first;
 
    typename std::iterator_traits<InputIt>::value_type sum = *first;
    *d_first = sum;
 
    while (++first != last) {
       sum = op(sum, *first);
       *++d_first = sum;
    }
    return ++d_first;
}

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

#include <numeric>
#include <vector>
#include <iostream>
#include <iterator>
#include <functional>
int main()
{
    std::vector<int> v = {2,2,2,2,2,2,2,2,2,2};
 
    std::cout << "The first 10 even numbers are: ";
    std::partial_sum(v.begin(), v.end(),
                     std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
 
    std::partial_sum(v.begin(), v.end(), v.begin(), std::multiplies<int>());
    std::cout << "The first 10 powers of 2 are: ";
    for(auto n: v) {
        std::cout << n << " ";
    }
    std::cout << '\n';
}

Вывод:

The first 10 even numbers are: 2 4 6 8 10 12 14 16 18 20
The first 10 powers of 2 are: 2 4 8 16 32 64 128 256 512 1024

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

{{dcl list tfun | cpp/algorithm/adjacent_difference |вычисляет разницу между соседними элементами в диапазоне {{dcl list tfun | cpp/algorithm/accumulate |суммирует диапазон элементов