Namespaces
Variants

std::ranges::for_each_n, std::ranges::for_each_n_result

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les intervalles (C++20)
Algorithmes contraints, p. 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 modification de séquence
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 connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des intervalles triés)
Opérations ensemblistes (sur des intervalles triés)
Opérations de fusion (sur des intervalles triés)
Opérations sur les tas
Opérations de 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 modificatrices
Opérations de modification de séquence
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des intervalles triés)
       
       
Opérations ensemblistes (sur des intervalles triés)
Opérations sur les tas
Opérations de 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::input_iterator I, class Proj = std::identity,
          std::indirectly_unary_invocable<std::projected<I, Proj>> Fun >
constexpr for_each_n_result<I, Fun>
    for_each_n( I first, std::iter_difference_t<I> count,
                Fun f, Proj proj = {} );
(1) (depuis C++20)
template< /*execution-policy*/ Ep,
          std::random_access_iterator I, class Proj = identity,
          std::indirectly_unary_invocable<std::projected<I, Proj>> Fun >
I for_each_n( Ep&& policy, I first, iter_difference_t<I> count,
              Fun f, Proj proj = {} );
(2) (depuis C++26)
Types auxiliaires
template< class I, class F >
using for_each_n_result = ranges::in_fun_result<I, F>;
(3) (depuis C++20)

Pour la définition de /*execution-policy*/, voir cette page.

Applique l'objet invocable donné f à chaque élément (projeté par proj) dans l'intervalle cible [firstranges::next(first, count)). Si f renvoie un résultat, le résultat est ignoré.

1) f est appliqué dans l'ordre de first.
2) f peut ne pas être appliqué dans l'ordre. L'algorithme est exécuté selon policy.
Contrairement aux autres algorithmes parallèles, for_each_n n'est pas autorisé à faire des copies arbitraires d'éléments de l'intervalle cible.

Si count >= 0 n'est pas true, le comportement est indéfini.

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

Paramètres

first - le début de la plage cible
count - le nombre d'éléments dans la plage cible
f - l'objet invocable à appliquer aux éléments (projetés)
proj - la projection à appliquer aux éléments
policy - la politique d'exécution à utiliser

Valeur de retour

1) {ranges::next(first, count), std::move(f)}
2) ranges::next(first, count)

Complexité

Exactement count applications de f et proj.

Exceptions

2) Pendant le processus d'exécution :
  • Si les ressources mémoire temporaires nécessaires à la parallélisation ne sont pas disponibles, std::bad_alloc est levée.
  • Si une exception non capturée est levée lors de l'accès aux objets via un argument d'algorithme, le comportement est déterminé par la politique d'exécution (pour politiques standard, std::terminate est invoqué).

Notes

Si la projection retourne une référence mutable, f peut modifier les éléments dans la plage cible.

Implémentation possible

struct for_each_n_fn
{
    template<std::input_iterator I, class Proj = std::identity,
             std::indirectly_unary_invocable<std::projected<I, Proj>> Fun>
    constexpr for_each_n_result<I, Fun>
        operator()(I first, std::iter_difference_t<I> count,
                   Fun fun, Proj proj = Proj{}) const
    {
        for (; count-- > 0; ++first)
            std::invoke(fun, std::invoke(proj, *first));
        return {std::move(first), std::move(fun)};
    }
};

inline constexpr for_each_n_fn for_each_n{};

Exemple

#include <algorithm>
#include <array>
#include <iostream>
#include <ranges>
#include <string_view>

struct P
{
    int first;
    char second;
    friend std::ostream& operator<<(std::ostream& os, const P& p)
    {
        return os << '{' << p.first << ",'" << p.second << "'}";
    }
};

auto print = [](std::string_view name, const auto& v)
{
    std::cout << name << ": ";
    for (auto n = v.size(); const auto& e : v)
        std::cout << e << (--n ? ", " : "\n");
};

int main()
{
    std::array a {1, 2, 3, 4, 5};
    print("a", a);
    // Negate first three numbers:
    std::ranges::for_each_n(a.begin(), 3, [](auto& n) { n *= -1; });
    print("a", a);
    
    std::array s { P{1,'a'}, P{2, 'b'}, P{3, 'c'}, P{4, 'd'} };
    print("s", s);
    // Negate data members “P::first” using projection:
    std::ranges::for_each_n(s.begin(), 2, [](auto& x) { x *= -1; }, &P::first);
    print("s", s);
    // Capitalize data members “P::second” using projection:
    std::ranges::for_each_n(s.begin(), 3, [](auto& c) { c -= 'a' - 'A'; }, &P::second);
    print("s", s);
}

Sortie :

a: 1, 2, 3, 4, 5
a: -1, -2, -3, 4, 5
s: {1,'a'}, {2,'b'}, {3,'c'}, {4,'d'}
s: {-1,'a'}, {-2,'b'}, {3,'c'}, {4,'d'}
s: {-1,'A'}, {-2,'B'}, {3,'C'}, {4,'d'}

Voir aussi

applique un objet fonction aux N premiers éléments d'une séquence
(modèle de fonction)
applique unobjet fonction unaireaux éléments d'uneplage
(modèle de fonction&objet fonction d'algorithme)
boucleforfor par plage(C++11) exécute une boucle sur une plage