Ежедневный бит(е) 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.