Namespaces
Variants

std::for_each_n

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

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

Opérations de tri
Opérations de recherche dichotomique
(sur des plages partitionnées)
Opérations sur les ensembles (sur des plages triées)
Opérations de fusion (sur des plages triées)
Opérations sur les tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Défini dans l'en-tête <algorithm>
template< class InputIt, class Size, class UnaryFunc >
InputIt for_each_n( InputIt first, Size count, UnaryFunc f );
(1) (constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt, class Size, class UnaryFunc >
ForwardIt for_each_n( ExecutionPolicy&& policy,
                      ForwardIt first, Size count, UnaryFunc f );
(2) (depuis C++17)

Applique l'objet invocable donné f à chaque élément de la plage cible [firststd::next(first, count)). Si f retourne un résultat, le résultat est ignoré.

1) f est appliqué dans l'ordre en commençant par first.
Si UnaryFunc n'est pas MoveConstructible, le comportement est indéfini.
2) f L'application peut ne pas se faire dans l'ordre. L'algorithme est exécuté selon policy.
Contrairement à d'autres algorithmes parallèles, for_each_n n'est pas autorisé à faire des copies arbitraires des éléments de la plage cible.
Cette surcharge ne participe à la résolution de surcharge que si la valeur de l'expression suivante est true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(jusqu'à C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(depuis C++20)
Si UnaryFunc n'est pas CopyConstructible, le comportement est indéfini.

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

Paramètres

first - le début de la plage cible
count - le nombre d'éléments dans la plage cible
f - objet fonction, à appliquer aux éléments

La signature de la fonction doit être équivalente à :

void fun(const Type &a);

La signature n'a pas besoin d'avoir const &.
Le type Type doit être tel qu'un objet de type InputIt peut être déréférencé puis converti implicitement en Type.

policy - la politique d'exécution à utiliser
Exigences de type
-
InputIt doit satisfaire les exigences de LegacyInputIterator.
-
ForwardIt doit satisfaire les exigences de LegacyForwardIterator.
-
Size doit être convertible en un type entier.

Valeur de retour

std::next(first, count)

Complexité

Exactement count applications de f.

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 de l'algorithme, le comportement est déterminé par la politique d'exécution (pour les politiques standard, std::terminate est invoqué).

Notes

Si le type d'itérateur (InputIt/ForwardIt) est mutable, f peut modifier les éléments de la plage cible.

Implémentation possible

Voir aussi l'implémentation dans libstdc++, libc++ et MSVC stdlib.

template<class InputIt, class Size, class UnaryFunc>
InputIt for_each_n(InputIt first, Size count, UnaryFunc f)
{
    for (Size i = 0; i < count; ++first, (void) ++i)
        f(*first);
    
    return first;
}

Exemple

#include <algorithm>
#include <iostream>
#include <vector>

void println(const auto& v)
{
    for (auto count{v.size()}; const auto& e : v)
        std::cout << e << (--count ? ", " : "\n");
}

int main()
{
    std::vector<int> vi{1, 2, 3, 4, 5};
    println(vi);
    
    std::for_each_n(vi.begin(), 3, [](auto& n) { n *= 2; });
    println(vi);
}

Sortie :

1, 2, 3, 4, 5
2, 4, 6, 4, 5

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement correct
LWG 3213
(P1718R2)
C++17 SizeIl n'était pas nécessaire que soit convertible en un type entier

Voir aussi

applique un objet fonction aux N premiers éléments d'une séquence
(objet fonction d'algorithme)
applique un objet fonction unaire aux éléments d'une plage
(modèle de fonction & objet fonction d'algorithme)
applique une fonction à une plage d'éléments, stockant les résultats dans une plage de destination
(modèle de fonction & objet fonction d'algorithme)
boucle for for basée sur une plage(C++11) exécute une boucle sur une plage