Ежедневный бит(е) C++ #239, Алгоритмы вычисления суммы префиксов из преобразованных значений: std::transform_inclusive_scan, std::transform_exclusive_scan.

std::transform_inclusive_scan и std::transform_exclusive_scan вычисляют сумму включающего/исключительного префикса на основе результатов преобразования, примененного к каждому элементу.

В отличие от std::partial_sum, сумма префикса является обобщенной и не вычисляется в строгом порядке, поэтому для получения детерминированных результатов требуется операция ассоциативного сокращения.

#include <numeric>
#include <functional>
#include <vector>


std::vector<int> data{1,1,1,1,1};
std::vector<int> out;

std::transform_inclusive_scan(
    data.begin(), data.end(), // Input range
    std::back_inserter(out), // Output iterator
    std::plus<>{}, // Reduction operation
    std::bind_front(std::multiplies<>{},2)); // Transformation op.
// out == {2, 4, 6, 8, 10}


out.clear();
std::transform_inclusive_scan(
    data.begin(), data.end(), // Input range
    std::back_inserter(out), // Output iterator
    std::plus<>{}, // Reduction operation
    std::bind_front(std::multiplies<>{},2), // Transformation op.
    100); // Initial value
// out == {102, 104, 106, 108, 110}


out.clear();
std::transform_exclusive_scan(
    data.begin(), data.end(), // Input range
    std::back_inserter(out), // Output iterator
    100, // Initial value (required)
    std::plus<>{}, // Reduction operation
    std::bind_front(std::multiplies<>{},2)); // Transformation op.
// out == {100, 102, 104, 106, 108}

Откройте пример в Compiler Explorer.