◐ Shell
clean mode source ↗

std::partial_sum — cppreference.com

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

<metanoindex/>

<tbody> </tbody>

Определено в заголовочном файле <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.

Оригинал:

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.

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Эквивалентная операция

Оригинал:

Equivalent operation:

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

*(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

диапазон элементов в сумме

Оригинал:

the range of elements to sum

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

d_first

В начале назначения диапазона

Оригинал:

the beginning of the destination range

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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 должен быть таков, что объект типа iterator_traits<InputIt>::value_type может быть неявно преобразован в Type1. Тип Type2 должен быть таков, что объект типа InputIt может быть разыменован и затем неявно преобразован в Type2. Тип Ret должен быть таков, что объекту типа iterator_traits<InputIt>::value_type можно присвоить значение типа Ret. ​

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

Возвращаемое значение

Итератор на элемент после последнего элемента написано.

Оригинал:

Iterator to the element past the last element written.

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Сложность

Именно (last - first) - 1 применения бинарной операции

Оригинал:

Exactly (last - first) - 1 applications of the binary operation

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Возможная реализация

Первый вариант
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

См. также