Namespaces
Variants

std::ranges::fold_left_first

De fr.cppreference.net
 
 
Bibliothèque des algorithmes
Algorithmes contraints et algorithmes sur les intervalles (C++20)
Algorithmes contraints, p. ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modifiantes
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations associées
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des intervalles partitionnés)
Opérations d'ensemble (sur des intervalles triés)
Opérations de fusion (sur des intervalles triés)
Opérations de tas
Opérations minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modifiantes
Opérations de séquence modifiantes
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des intervalles triés)
       
       
Opérations d'ensemble (sur des intervalles triés)
Opérations de tas
Opérations minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur la mémoire non initialisée
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
template< std::input_iterator I, std::sentinel_for<I> S,
          /*indirectly-binary-left-foldable*/<std::iter_value_t<I>, I> F >
requires std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>>
constexpr auto
    fold_left_first( I first, S last, F f );
(1) (depuis C++23)
template< ranges::input_range R,
          /*indirectly-binary-left-foldable*/<
                ranges::range_value_t<R>, ranges::iterator_t<R>> F >
requires std::constructible_from<
             ranges::range_value_t<R>, ranges::range_reference_t<R>>
constexpr auto
    fold_left_first( R&& r, F f );
(2) (depuis C++23)
Concepts d'aide
template< class F, class T, class I >
concept /*indirectly-binary-left-foldable*/ = /* see description */;
(3) (exposé uniquement*)

Effectue un pliage à gauche des éléments de l'intervalle donné, c'est-à-dire retourne le résultat de l'évaluation de l'expression en chaîne :
f(f(f(f(x1, x2), x3), ...), xn), où x1, x2, ..., xn sont les éléments de l'intervalle.

Informellement, ranges::fold_left_first se comporte comme la surcharge de std::accumulate qui accepte un prédicat binaire, sauf que le *first est utilisé en interne comme élément initial.

Le comportement est indéfini si [firstlast) n'est pas un intervalle valide.

1) L'intervalle est [firstlast). Équivalent à return ranges::fold_left_first_with_iter(std::move(first), last, f).value.
2) Identique à (1), sauf qu'il utilise r comme intervalle, comme si ranges::begin(r) était utilisé comme first et ranges::end(r) comme last.
3) Équivalent à :
Concepts d'aide
template< class F, class T, class I, class U >
concept /*indirectly-binary-left-foldable-impl*/ =
    std::movable<T> &&
    std::movable<U> &&
    std::convertible_to<T, U> &&
    std::invocable<F&, U, std::iter_reference_t<I>> &&
    std::assignable_from<U&,
        std::invoke_result_t<F&, U, std::iter_reference_t<I>>>;
(3A) (exposé uniquement*)
template< class F, class T, class I >
concept /*indirectly-binary-left-foldable*/ =
    std::copy_constructible<F> &&
    std::indirectly_readable<I> &&
    std::invocable<F&, T, std::iter_reference_t<I>> &&
    std::convertible_to<std::invoke_result_t<F&, T, std::iter_reference_t<I>>,
        std::decay_t<std::invoke_result_t<F&, T, std::iter_reference_t<I>>>> &&
    /*indirectly-binary-left-foldable-impl*/<F, T, I,
        std::decay_t<std::invoke_result_t<F&, T, std::iter_reference_t<I>>>>;
(3B) (exposé uniquement*)

Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithme (informellement appelés niebloids), c'est-à-dire :

Paramètres

first, last - la paire itérateur-sentinelle définissant l'intervalle d'éléments à plier
r - l'intervalle d'éléments à plier
f - l'objet fonction binaire

Valeur de retour

Un objet de type std::optional<U> qui contient le résultat du pliage à gauche de l'intervalle donné sur f, où U est équivalent à decltype(ranges::fold_left(std::move(first), last, std::iter_value_t<I>(*first), f)).

Si l'intervalle est vide, std::optional<U>() est retourné.

Implémentations possibles

struct fold_left_first_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S,
             /*indirectly-binary-left-foldable*/<std::iter_value_t<I>, I> F>
    requires
        std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>>
    constexpr auto operator()(I first, S last, F f) const
    {
        using U = decltype(
            ranges::fold_left(std::move(first), last, std::iter_value_t<I>(*first), f)
        );
        if (first == last)
            return std::optional<U>();
        std::optional<U> init(std::in_place, *first);
        for (++first; first != last; ++first)
            *init = std::invoke(f, std::move(*init), *first);
        return std::move(init);
    }

    template<ranges::input_range R,
             /*indirectly-binary-left-foldable*/<
                 ranges::range_value_t<R>, ranges::iterator_t<R>> F>
    requires
        std::constructible_from<ranges::range_value_t<R>, ranges::range_reference_t<R>>
    constexpr auto operator()(R&& r, F f) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::ref(f));
    }
};

inline constexpr fold_left_first_fn fold_left_first;

Complexité

Exactement ranges::distance(first, last) - 1 (en supposant que l'intervalle n'est pas vide) applications de l'objet fonction f.

Notes

Le tableau suivant compare tous les algorithmes de pliage contraints :

Fonction template de pliage Commence par Valeur initiale Type de retour
ranges::fold_left gauche init U
ranges::fold_left_first gauche premier élément std::optional<U>
ranges::fold_right droite init U
ranges::fold_right_last droite dernier élément std::optional<U>
ranges::fold_left_with_iter gauche init

(1) ranges::in_value_result<I, U>

(2) ranges::in_value_result<BR, U>,

BR est ranges::borrowed_iterator_t<R>

ranges::fold_left_first_with_iter gauche premier élément

(1) ranges::in_value_result<I, std::optional<U>>

(2) ranges::in_value_result<BR, std::optional<U>>

BR est ranges::borrowed_iterator_t<R>

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_ranges_fold 202207L (C++23) std::ranges algorithmes de pliage

Exemple

#include <algorithm>
#include <array>
#include <functional>
#include <ranges>
#include <utility>

int main()
{
    constexpr std::array v{1, 2, 3, 4, 5, 6, 7, 8};
    static_assert
    (
        *std::ranges::fold_left_first(v.begin(), v.end(), std::plus{}) == 36
        && *std::ranges::fold_left_first(v, std::multiplies{}) == 40320
    );

    constexpr std::array w
    {
        1, 2, 3, 4, 13,
        1, 2, 3, 4, 13,
        1, 2, 3, 4, 13,
        1, 2, 3, 4,
    };
    static_assert
    (
        "Find the only value that (by precondition) occurs odd number of times:"
        && *std::ranges::fold_left_first(w, [](int p, int q){ return p ^ q; }) == 13
    );

    constexpr auto pairs = std::to_array<std::pair<char, float>>
    ({
        {'A', 3.0f},
        {'B', 3.5f},
        {'C', 4.0f}
    });
    static_assert
    (
        "Get the product of all pair::second in pairs:"
        && *std::ranges::fold_left_first
        (
            pairs | std::ranges::views::values, std::multiplies{}
        ) == 42
    );
}

Références

  • Norme C++23 (ISO/IEC 14882:2024) :
  • 27.6.18 Plie [alg.fold]

Voir aussi

plie à gauche un intervalle d'éléments
(objet fonction d'algorithme)
plie à droite un intervalle d'éléments
(objet fonction d'algorithme)
plie à droite un intervalle d'éléments en utilisant le dernier élément comme valeur initiale
(objet fonction d'algorithme)
plie à gauche un intervalle d'éléments et retourne une paire (itérateur, valeur)
(objet fonction d'algorithme)
plie à gauche un intervalle d'éléments en utilisant le premier élément comme valeur initiale et retourne une paire (itérateur, optional)
(objet fonction d'algorithme)
additionne ou plie un intervalle d'éléments
(modèle de fonction)
(C++17)
similaire à std::accumulate, sauf dans le désordre
(modèle de fonction)