std::for_each_n
| 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 [first, std::next(first, count)). Si f retourne un résultat, le résultat est ignoré.
f est appliqué dans l'ordre en commençant par first.UnaryFunc n'est pas MoveConstructible, le comportement est indéfini.f L'application peut ne pas se faire dans l'ordre. L'algorithme est exécuté selon policy.for_each_n n'est pas autorisé à faire des copies arbitraires des éléments de la plage cible.true:
|
|
(jusqu'à C++20) |
|
|
(depuis C++20) |
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 à :
La signature n'a pas besoin d'avoir |
| 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
- 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
(C++20) |
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) | |
(C++20) |
|
| 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) | |
(C++20) |
|
boucle for for basée sur une plage(C++11)
|
exécute une boucle sur une plage |