Namensräume
Varianten
Aktionen

std::for_each_n

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
for_each_n
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
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 >
ForwardIt for_each_n( ExecutionPolicy&& policy,

                      ForwardIt first, Size n, UnaryFunc f );
(2) (seit C++17)

Wendet das gegebene Funktionsobjekt f auf das Ergebnis des Dereferenzierens jedes Iterators im Bereich [firstfirst + n) an. Wenn f ein Ergebnis zurückgibt, wird das Ergebnis ignoriert.

1) f wird beginnend mit first in Reihenfolge angewendet.
Wenn UnaryFunc nicht MoveConstructible ist, ist das Verhalten undefiniert.
2) f wird möglicherweise nicht in Reihenfolge angewendet. Der Algorithmus wird gemäß policy ausgeführt.
Diese Überladung nimmt an der Überladungsauflösung teil, nur wenn alle folgenden Bedingungen erfüllt sind

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 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 [firstfirst + n) angewendet werden soll

Die Signatur der Funktion sollte äquivalent zu folgender sein:

 void fun(const Type &a);

Die Signatur muss nicht const & haben.
Der Typ  Type muss so beschaffen sein, dass ein Objekt vom Typ InputIt dereferenziert und dann implizit in  Type konvertiert werden kann.

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 ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist 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) [edit]
Bereichs-for-Schleife(C++11) führt Schleife über einen Bereich aus[bearbeiten]
wendet ein unäres Funktionsobjekt auf Elemente aus einem Bereich an
(Funktion-Template) [bearbeiten]
Wendet ein Funktionsobjekt auf die ersten N Elemente einer Sequenz an
(Algorithmus-Funktionsobjekt)[edit]