Files
cppdraft_translate/cppdraft/alg/fold.md
2025-10-25 03:02:53 +03:00

10 KiB
Raw Blame History

[alg.fold]

26 Algorithms library [algorithms]

26.6 Non-modifying sequence operations [alg.nonmodifying]

26.6.18 Fold [alg.fold]

🔗

template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<I> S, class T = iter_value_t<I>, [indirectly-binary-left-foldable](algorithm.syn#concept:indirectly-binary-left-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<T, I> F> constexpr auto ranges::fold_left(I first, S last, T init, F f); template<[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]") R, class T = range_value_t<R>, [indirectly-binary-left-foldable](algorithm.syn#concept:indirectly-binary-left-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<T, iterator_t<R>> F> constexpr auto ranges::fold_left(R&& r, T init, F f);

1

#

Returns: ranges::fold_left_with_iter(std::move(first), last, std::move(init), f).value

🔗

template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<I> S, [indirectly-binary-left-foldable](algorithm.syn#concept:indirectly-binary-left-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<iter_value_t<I>, I> F> requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<I>, iter_reference_t<I>> constexpr auto ranges::fold_left_first(I first, S last, F f); template<[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]") R, [indirectly-binary-left-foldable](algorithm.syn#concept:indirectly-binary-left-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<range_value_t<R>, iterator_t<R>> F> requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<range_value_t<R>, range_reference_t<R>> constexpr auto ranges::fold_left_first(R&& r, F f);

2

#

Returns: ranges::fold_left_first_with_iter(std::move(first), last, f).value

🔗

template<[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12Concept bidirectional_­iterator[iterator.concept.bidir]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<I> S, class T = iter_value_t<I>, [indirectly-binary-right-foldable](algorithm.syn#concept:indirectly-binary-right-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<T, I> F> constexpr auto ranges::fold_right(I first, S last, T init, F f); template<[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6Other range refinements[range.refinements]") R, class T = range_value_t<R>, [indirectly-binary-right-foldable](algorithm.syn#concept:indirectly-binary-right-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<T, iterator_t<R>> F> constexpr auto ranges::fold_right(R&& r, T init, F f);

3

#

Effects: Equivalent to:using U = decay_t<invoke_result_t<F&, iter_reference_t, T>>;if (first == last)return U(std::move(init)); I tail = ranges::next(first, last); U accum = invoke(f, *--tail, std::move(init));while (first != tail) accum = invoke(f, *--tail, std::move(accum));return accum;

🔗

template<[bidirectional_iterator](iterator.concept.bidir#concept:bidirectional_iterator "24.3.4.12Concept bidirectional_­iterator[iterator.concept.bidir]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<I> S, [indirectly-binary-right-foldable](algorithm.syn#concept:indirectly-binary-right-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<iter_value_t<I>, I> F> requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<I>, iter_reference_t<I>> constexpr auto ranges::fold_right_last(I first, S last, F f); template<[bidirectional_range](range.refinements#concept:bidirectional_range "25.4.6Other range refinements[range.refinements]") R, [indirectly-binary-right-foldable](algorithm.syn#concept:indirectly-binary-right-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<range_value_t<R>, iterator_t<R>> F> requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<range_value_t<R>, range_reference_t<R>> constexpr auto ranges::fold_right_last(R&& r, F f);

4

#

Let U bedecltype(ranges::fold_right(first, last, iter_value_t(*first), f)).

5

#

Effects: Equivalent to:if (first == last)return optional(); I tail = ranges::prev(ranges::next(first, std::move(last)));return optional(in_place, ranges::fold_right(std::move(first), tail, iter_value_t(*tail), std::move(f)));

🔗

template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<I> S, class T = iter_value_t<I>, [indirectly-binary-left-foldable](algorithm.syn#concept:indirectly-binary-left-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<T, I> F> constexpr see below ranges::fold_left_with_iter(I first, S last, T init, F f); template<[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]") R, class T = range_value_t<R>, [indirectly-binary-left-foldable](algorithm.syn#concept:indirectly-binary-left-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<T, iterator_t<R>> F> constexpr see below ranges::fold_left_with_iter(R&& r, T init, F f);

6

#

Let U be decay_t<invoke_result_t<F&, T, iter_reference_t>>.

7

#

Effects: Equivalent to:if (first == last)return {std::move(first), U(std::move(init))}; U accum = invoke(f, std::move(init), *first);for (++first; first != last; ++first) accum = invoke(f, std::move(accum), *first);return {std::move(first), std::move(accum)};

8

#

Remarks: The return type isfold_left_with_iter_result<I, U> for the first overload andfold_left_with_iter_result<borrowed_iterator_t, U> for the second overload.

🔗

template<[input_iterator](iterator.concept.input#concept:input_iterator "24.3.4.9Concept input_­iterator[iterator.concept.input]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7Concept sentinel_­for[iterator.concept.sentinel]")<I> S, [indirectly-binary-left-foldable](algorithm.syn#concept:indirectly-binary-left-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<iter_value_t<I>, I> F> requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<iter_value_t<I>, iter_reference_t<I>> constexpr see below ranges::fold_left_first_with_iter(I first, S last, F f); template<[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]") R, [indirectly-binary-left-foldable](algorithm.syn#concept:indirectly-binary-left-foldable "26.4Header <algorithm> synopsis[algorithm.syn]")<range_value_t<R>, iterator_t<R>> F> requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<range_value_t<R>, range_reference_t<R>> constexpr see below ranges::fold_left_first_with_iter(R&& r, F f);

9

#

Let U bedecltype(ranges::fold_left(std::move(first), last, iter_value_t(*first), f))

10

#

Effects: Equivalent to:if (first == last)return {std::move(first), optional()}; optional init(in_place, *first);for (++first; first != last; ++first)*init = invoke(f, std::move(*init), *first);return {std::move(first), std::move(init)};

11

#

Remarks: The return type isfold_left_first_with_iter_result<I, optional> for the first overload andfold_left_first_with_iter_result<borrowed_iterator_t, optional> for the second overload.