Daily bit(e) C++. ranges::fold_left, ranges::fold_left_first, ranges::fold_right, ranges::fold_right_last

Добавлено 24 сентября 2026 в 13:58

Daily bit(e) C++ 124, алгоритмы свёртки (fold) в C++23 – ranges::fold_left, ranges::fold_left_first, ranges::fold_right, ranges::fold_right_last.

Daily bit(e) C++

В стандарт C++23 был добавлен набор алгоритмов свёртки, работающих с диапазонами (ranges) и призванных заменить числовой алгоритм std::accumulate.

Библиотека предоставляет алгоритмы как для левой, так и для правой свёртки: std::ranges::fold_left и std::ranges::fold_right.

А также варианты, использующие первый или последний элементы в качестве начального значения: std::ranges::fold_left_first и std::ranges::fold_right_last.

#include <algorithm>
#include <vector>
#include <cstdint>

std::vector<int64_t> data{1,2,3,4,5,6};

// Левая свёртка с начальным значением.  
auto v = std::ranges::fold_left(data, 10, std::plus<>{});
// В отличие от std::accumulate, тип результата определяется
// результатом вызова operation(init, elem).
// decltype(v) == int64_t, v == 31

// Правая свёртка, использующая последний элемент 
// в качестве инициализатора.
auto w = std::ranges::fold_right_last(data, std::plus<>{});
// Результат - это std::optional, позволяющий работать
// с пустыми диапазонами.
// decltype(w) == std::optional<int64_t>, w == 21

std::vector<int64_t> empty;
// Левая свёртка, использующая первый элемент
// в качестве инициализатора.
auto z = std::ranges::fold_left_first(empty, std::plus<>{});
// z.has_value() == false

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование