Namespaces
Variants

std::ranges::fold_right_last

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les plages (C++20)
Algorithmes contraints, par ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
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)

Opérations de tri et connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des plages partitionnées)
Opérations d'ensemble (sur des plages triées)
Opérations de fusion (sur des plages triées)
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 dans ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modificatrices
Opérations de séquence modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des plages triées)
       
       
Opérations d'ensemble (sur des plages triées)
Opérations de tas
Opérations minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
template< std::bidirectional_iterator I, std::sentinel_for<I> S,
          /*indirectly-binary-right-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_right_last( I first, S last, F f );
(1) (depuis C++23)
template< ranges::bidirectional_range R,
          /*indirectly-binary-right-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_right_last( R&& r, F f );
(2) (depuis C++23)
Concepts auxiliaires
template< class F, class T, class I >
concept /*indirectly-binary-left-foldable*/ = /* see description */;
(3) (exposé uniquement*)
template< class F, class T, class I >
concept /*indirectly-binary-right-foldable*/ = /* see description */;
(4) (exposé uniquement*)

Plie à droite les éléments de l'intervalle donné, c'est-à-dire retourne le résultat de l'évaluation de l'expression en chaîne :, où
f(x1, f(x2, ...f(xn-1, xn))), x1, ..., x2 sont les éléments de l'intervalle. xnInformellement,

se comporte comme ranges::fold_right_last (en supposant que l'intervalle n'est pas vide). ranges::fold_left(views::reverse(r), *--last, /*flipped*/(f))Le comportement est indéfini si

n'est pas un intervalle valide. [firstlast)1)

L'intervalle est . Étant donné [firstlast) comme U, équivaut à : decltype(ranges::fold_right(first, last, std::iter_value_t<I>(*first), f))2)
if (first == last)
    return std::optional<U>();
I tail = ranges::prev(ranges::next(first, std::move(last)));
return std::optional<U>(std::in_place, ranges::fold_right(std::move(first), tail,
    std::iter_value_t<I>(*tail), std::move(f)));
Identique à (1), sauf qu'il utilise comme intervalle, comme si en utilisant r comme ranges::begin(r) et first comme ranges::end(r).last3)
Équivaut à : Concepts auxiliaires
(3A)
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>>>;
( exposé uniquement*) (3B)
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>>>>;
( exposé uniquement*)4)
Équivaut à : Concepts auxiliaires
(4A)
template< class F, class T, class I >
concept /*indirectly-binary-right-foldable*/ =
    /*indirectly-binary-left-foldable*/</*flipped*/<F>, T, I>;
( exposé uniquement*)Classes auxiliaires de modèles
(4B)
template< class F >
class /*flipped*/
{
    F f;    // exposition only
public:
    template< class T, class U >
        requires std::invocable<F&, U, T>
    std::invoke_result_t<F&, U, T> operator()( T&&, U&& );
};
( exposé uniquement*)Les entités de type fonction décrites sur cette page sont des

objets fonctions d'algorithme (informellement appelés niebloids), c'est-à-dire : Les listes d'arguments de template explicites ne peuvent pas être spécifiées lors de l'appel de l'un d'entre eux.

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

qui contient le résultat du std::optional<U>pliage à droite de l'intervalle donné sur . fSi l'intervalle est vide,

est retourné. std::optional<U>()Implémentations possibles

Complexité

struct fold_right_last_fn
{
    template<std::bidirectional_iterator I, std::sentinel_for<I> S,
             /*indirectly-binary-right-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_right(first, last, std::iter_value_t<I>(*first), f));

        if (first == last)
            return std::optional<U>();
        I tail = ranges::prev(ranges::next(first, std::move(last)));
        return std::optional<U>(std::in_place,
            ranges::fold_right(std::move(first), tail, std::iter_value_t<I>(*tail),
                               std::move(f)));
    }

    template<ranges::bidirectional_range R,
             /*indirectly_binary_right_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_right_last_fn fold_right_last;

Exactement

applications de l'objet fonction ranges::distance(first, last). fNotes

Le tableau suivant compare tous les algorithmes de pliage contraints :

Fonction template de pliage

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

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

, ranges::in_value_result<BR, U>

est BRgaucheranges::borrowed_iterator_t<R>

ranges::fold_left_first_with_iter premier élément (1)

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

ranges::in_value_result<BR, std::optional<U>>

est BRMacro de testranges::borrowed_iterator_t<R>

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

Exécuter ce code

#include <algorithm>
#include <functional>
#include <iostream>
#include <ranges>
#include <utility>
#include <vector>

int main()
{
    auto v = {1, 2, 3, 4, 5, 6, 7, 8};
    std::vector<std::string> vs {"A", "B", "C", "D"};

    auto r1 = std::ranges::fold_right_last(v.begin(), v.end(), std::plus<>()); // (1)
    std::cout << "*r1: " << *r1 << '\n';

    auto r2 = std::ranges::fold_right_last(vs, std::plus<>()); // (2)
    std::cout << "*r2: " << *r2 << '\n';

    // Use a program defined function object (lambda-expression):
    auto r3 = std::ranges::fold_right_last(v, [](int x, int y) { return x + y + 99; });
    std::cout << "*r3: " << *r3 << '\n';

    // Get the product of the std::pair::second of all pairs in the vector:
    std::vector<std::pair<char, float>> data {{'A', 3.f}, {'B', 3.5f}, {'C', 4.f}};
    auto r4 = std::ranges::fold_right_last
    (
        data | std::ranges::views::values, std::multiplies<>()
    );
    std::cout << "*r4: " << *r4 << '\n';
}

Références

*r1: 36
*r2: ABCD
*r3: 729
*r4: 42

Norme C++23 (ISO/IEC 14882:2024) :

  • 27.6.18 Pliage
  • alg.fold[Voir aussi]

ranges::fold_right

plie à droite un intervalle d'éléments
(objet fonction d'algorithme)
ranges::fold_left
plie à gauche un intervalle d'éléments
(objet fonction d'algorithme)
ranges::fold_left_first
plie à gauche un intervalle d'éléments en utilisant le premier élément comme valeur initiale
(objet fonction d'algorithme)
ranges::fold_left_with_iter
plie à gauche un intervalle d'éléments et retourne une
paire (itérateur, valeur)(objet fonction d'algorithme)
ranges::fold_left_first_with_iter
plie à gauche un intervalle d'éléments en utilisant le premier élément comme valeur initiale et retourne une
paire (itérateur, optionnel)(objet fonction d'algorithme)
accumulate
(fonction template)
reduce
similaire à
std::accumulate, sauf en désordre (fonction template)