std::for_each_n
| Definiert in Header <algorithm> |
||
| template< class InputIt, class Size, class UnaryFunc > InputIt for_each_n( InputIt first, Size n, UnaryFunc f ); |
(1) | (seit C++17) (constexpr seit C++20) |
| template< class ExecutionPolicy, class ForwardIt, class Size, class UnaryFunc > |
(2) | (seit C++17) |
Wendet das gegebene Funktionsobjekt f auf das Ergebnis des Dereferenzierens jedes Iterators im Bereich [first, first + n) an. Wenn f ein Ergebnis zurückgibt, wird das Ergebnis ignoriert.
UnaryFunc nicht MoveConstructible ist, ist das Verhalten undefiniert.|
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> ist true. |
(bis C++20) |
|
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> ist true. |
(seit C++20) |
UnaryFunc nicht CopyConstructible ist, ist das Verhalten undefiniert.Wenn n >= 0 nicht true ist, ist das Verhalten undefiniert.
Wenn der Iteratortyp (InputIt/ForwardIt) veränderbar ist, kann f die Elemente des Bereichs über den dereferenzierten Iterator modifizieren.
Im Gegensatz zu den anderen parallelen Algorithmen darf for_each_n keine Kopien der Elemente in der Sequenz erstellen, auch wenn diese TriviallyCopyable sind.
Inhalt |
[bearbeiten] Parameter
| first | - | der Anfang des Bereichs, auf den die Funktion angewendet werden soll |
| n | - | die Anzahl der Elemente, auf die die Funktion angewendet werden soll |
| policy | - | die Ausführungsrichtlinie, die verwendet werden soll |
| f | - | Funktionsobjekt, das auf das Ergebnis des Dereferenzierens jedes Iterators im Bereich [first, first + n) angewendet werden sollDie Signatur der Funktion sollte äquivalent zu folgender sein: void fun(const Type &a); Die Signatur muss nicht const & haben. |
| Typanforderungen | ||
-InputIt muss die Anforderungen von LegacyInputIterator erfüllen. | ||
-ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen. | ||
-Size muss in einen ganzzahligen Typ konvertierbar sein. | ||
[bearbeiten] Rückgabewert
Ein Iterator, der gleich first + n ist, oder formaler, gleich std::advance(first, n).
[bearbeiten] Komplexität
Genau n Anwendungen von f.
[bearbeiten] Ausnahmen
Die Überladung mit einem Template-Parameter namens ExecutionPolicy meldet Fehler wie folgt
- Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsabhängig. - Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.
[bearbeiten] Mögliche Implementierung
Siehe auch die Implementierung in libstdc++, libc++ und MSVC stdlib.
template<class InputIt, class Size, class UnaryFunc> InputIt for_each_n(InputIt first, Size n, UnaryFunc f) { for (Size i = 0; i < n; ++first, (void) ++i) f(*first); return first; } |
[bearbeiten] Beispiel
#include <algorithm> #include <iostream> #include <vector> void println(auto const& 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); }
Ausgabe
1, 2, 3, 4, 5 2, 4, 6, 4, 5
[bearbeiten] Siehe auch
| Wendet eine Funktion auf einen Elementbereich an und speichert die Ergebnisse in einem Zielbereich (Funktionstempelat) | |
Bereichs-for-Schleife(C++11) |
führt Schleife über einen Bereich aus |
| wendet ein unäres Funktionsobjekt auf Elemente aus einem Bereich an (Funktion-Template) | |
| (C++20) |
Wendet ein Funktionsobjekt auf die ersten N Elemente einer Sequenz an (Algorithmus-Funktionsobjekt) |