Namespaces
Variants

std:: for_each

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
for_each
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Défini dans l'en-tête <algorithm>
template < class InputIt, class UnaryFunc >
UnaryFunc for_each ( InputIt first, InputIt last, UnaryFunc f ) ;
(1) (constexpr depuis C++20)
template < class ExecutionPolicy, class ForwardIt, class UnaryFunc >

void for_each ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last, UnaryFunc f ) ;
(2) (depuis C++17)

Applique l'objet fonction unaire donné function object f au résultat de la déréférenciation de chaque iterator dans l'intervalle range [ first , last ) . Si f retourne un résultat, ce 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 .

(depuis C++11)
2) f pourrait ne pas être appliqué dans l'ordre. L'algorithme est exécuté conformément à la policy .
Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'à C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(depuis C++20)

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

Contrairement aux autres algorithmes parallèles, for_each n'est pas autorisé à effectuer des copies des éléments dans la séquence, même s'ils sont TriviallyCopyable .

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant l'intervalle d'éléments auquel l' objet fonction sera appliqué
policy - la politique d'exécution à utiliser
f - objet fonction, à appliquer au résultat du déréférencement de chaque itérateur dans l'intervalle [ first , last )

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 puisse être déréférencé puis implicitement converti en Type .

Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator .
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator .

Valeur de retour

1) f
2) (aucun)

Complexité

Exactement std:: distance ( first, last ) applications de f .

Exceptions

La surcharge avec un paramètre de modèle nommé ExecutionPolicy signale les erreurs comme suit :

  • Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que ExecutionPolicy fait partie des politiques standard , std::terminate est appelé. Pour tout autre ExecutionPolicy , le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.

Implémentation possible

Voir également les implémentations dans libstdc++ , libc++ et MSVC stdlib .

template<class InputIt, class UnaryFunc>
constexpr UnaryFunc for_each(InputIt first, InputIt last, UnaryFunc f)
{
    for (; first != last; ++first)
        f(*first);
    return f; // déplacement implicite depuis C++11
}

Notes

Pour la surcharge ( 1 ) , f peut être un objet fonction avec état. La valeur de retour peut être considérée comme l'état final de l'opération par lot.

Pour la surcharge ( 2 ) , plusieurs copies de f peuvent être créées pour effectuer un appel parallèle. Aucune valeur n'est retournée car la parallélisation ne permet souvent pas une accumulation efficace d'état.

Exemple

L'exemple suivant utilise une expression lambda pour incrémenter tous les éléments d'un vecteur, puis utilise un operator() surchargé dans un objet fonction (également appelé "foncteur") pour calculer leur somme. Notez que pour calculer la somme, il est recommandé d'utiliser l'algorithme dédié std::accumulate .

#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
    std::vector<int> v{3, -4, 2, -8, 15, 267};
    auto print = [](const int& n) { std::cout << n << ' '; };
    std::cout << "before:\t";
    std::for_each(v.cbegin(), v.cend(), print);
    std::cout << '\n';
    // incrémenter les éléments en place
    std::for_each(v.begin(), v.end(), [](int &n) { n++; });
    std::cout << "after:\t";
    std::for_each(v.cbegin(), v.cend(), print);
    std::cout << '\n';
    struct Sum
    {
        void operator()(int n) { sum += n; }
        int sum {0};
    };
    // invoquer Sum::operator() pour chaque élément
    Sum s = std::for_each(v.cbegin(), v.cend(), Sum());    
    std::cout << "sum:\t" << s.sum << '\n';
}

Sortie :

before:	3 -4 2 -8 15 267 
after:	4 -3 3 -7 16 268 
sum:	281

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 Applicable à Comportement publié Comportement corrigé
LWG 475 C++98 il n'était pas clair si f pouvait modifier les éléments
de la séquence itérée ( for_each est classé comme
"opérations de séquence non modifiantes")
clarifié (autorisé si le type
d'itérateur est mutable)
LWG 2747 C++11 la surcharge ( 1 ) renvoyait std :: move ( f ) renvoie f (qui se déplace implicitement)

Voir aussi

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