std:: for_each
|
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,
|
(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é.
|
Si
|
(depuis C++11) |
|
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
&
.
|
| Exigences de type | ||
-
InputIt
doit satisfaire aux exigences de
LegacyInputIterator
.
|
||
-
ForwardIt
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||
Valeur de retour
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
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, 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) |
|
(C++20)
|
applique un
objet fonction
unaire aux éléments d'une
plage
(objet fonction algorithme) |
|
(C++20)
|
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 |