std:: for_each_n
|
Definiert im 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 der Dereferenzierung jedes Iterators im Bereich
[
first
,
first
+
n
)
an. Falls
f
ein Ergebnis zurückgibt, wird das Ergebnis ignoriert.
|
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) |
Wenn n >= 0 nicht true ist, ist das Verhalten undefiniert.
Wenn der Iteratortyp (
InputIt
/
ForwardIt
) mutable ist,
f
kann die Elemente des Bereichs durch den dereferenzierten Iterator modifizieren.
Im Gegensatz zu den anderen parallelen Algorithmen ist es
for_each_n
nicht gestattet, Kopien der Elemente in der Sequenz zu erstellen, selbst wenn sie
TriviallyCopyable
sind.
Inhaltsverzeichnis |
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 zu verwendende Ausführungsrichtlinie |
| f | - |
Funktionsobjekt, das auf das Ergebnis der Dereferenzierung jedes Iterators im Bereich
[
first
,
first
+
n
)
Die Signatur der Funktion sollte äquivalent zu Folgendem sein: void fun ( const Type & a ) ;
Die Signatur muss nicht
const
&
enthalten.
|
| Typanforderungen | ||
-
InputIt
muss die Anforderungen von
LegacyInputIterator
erfüllen.
|
||
-
ForwardIt
muss die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
-
Size
muss in einen integralen Typ konvertierbar sein.
|
||
Rückgabewert
Ein Iterator gleich first + n , oder formaler ausgedrückt, gleich std:: advance ( first, n ) .
Komplexität
Genau n Anwendungen von f .
Exceptions
Die Überladung mit einem Template-Parameter namens
ExecutionPolicy
meldet Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.
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; } |
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
Siehe auch
|
wendet eine Funktion auf einen Elementbereich an und speichert die Ergebnisse in einem Zielbereich
(Funktions-Template) |
|
Bereichs-
for
Schleife
(C++11)
|
führt Schleife über Bereich aus |
|
wendet ein unäres
Funktionsobjekt
auf Elemente aus einem
Bereich
an
(Funktions-Template) |
|
|
(C++20)
|
wendet ein Funktionsobjekt auf die ersten N Elemente einer Sequenz an
(Algorithmus-Funktionsobjekt) |