Namespaces
Variants

std:: for_each

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
for_each
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Definiert im Header <algorithm>
template < class InputIt, class UnaryFunc >
UnaryFunc for_each ( InputIt first, InputIt last, UnaryFunc f ) ;
(1) (constexpr seit C++20)
template < class ExecutionPolicy, class ForwardIt, class UnaryFunc >

void for_each ( ExecutionPolicy && policy,

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

Wendet das gegebene unäre Funktionsobjekt f auf das Ergebnis der Dereferenzierung jedes Iterators im Bereich [ first , last ) an. Falls f ein Ergebnis zurückgibt, wird das Ergebnis ignoriert.

1) f wird in Reihenfolge beginnend mit first angewendet.

Falls UnaryFunc nicht MoveConstructible ist, ist das Verhalten undefiniert .

(since C++11)
2) f könnte nicht in Reihenfolge angewendet werden. Der Algorithmus wird gemäß policy ausgeführt.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, 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 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 nicht erlaubt, Kopien der Elemente in der Sequenz zu erstellen, selbst wenn sie TriviallyCopyable sind.

Inhaltsverzeichnis

Parameter

first, last - das Paar von Iteratoren, das den Bereich der Elemente definiert, auf die das Funktionsobjekt angewendet wird
policy - die zu verwendende Ausführungsrichtlinie
f - Funktionsobjekt, das auf das Ergebnis der Dereferenzierung jedes Iterators im Bereich [ first , last )

Die Signatur der Funktion sollte äquivalent zu Folgendem sein:

void fun ( const Type & a ) ;

Die Signatur muss nicht const & enthalten.
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.

Rückgabewert

1) f
2) (keine)

Komplexität

Genau std:: distance ( first, last ) Anwendungen von f .

Ausnahmen

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 ExecutionPolicy einer der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc geworfen.

Mögliche Implementierung

Siehe auch die Implementierungen in libstdc++ , libc++ und 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; // implizites Move seit C++11
}

Hinweise

Für Überladung ( 1 ) kann f ein zustandsbehaftetes Funktionsobjekt sein. Der Rückgabewert kann als Endzustand des Stapelvorgangs betrachtet werden.

Für Überladung ( 2 ) können mehrere Kopien von f erstellt werden, um parallelen Aufruf durchzuführen. Es wird kein Wert zurückgegeben, da Parallelisierung häufig keine effiziente Zustandsakkumulation erlaubt.

Beispiel

Das folgende Beispiel verwendet einen Lambda-Ausdruck , um alle Elemente eines Vektors zu inkrementieren, und verwendet dann einen überladenen operator() in einem Funktionsobjekt (auch bekannt als "Funktor"), um deren Summe zu berechnen. Beachten Sie, dass zur Berechnung der Summe der spezielle Algorithmus std::accumulate empfohlen wird.

#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';
    // Elemente direkt inkrementieren
    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};
    };
    // Sum::operator() für jedes Element aufrufen
    Sum s = std::for_each(v.cbegin(), v.cend(), Sum());    
    std::cout << "sum:\t" << s.sum << '\n';
}

Ausgabe:

before:	3 -4 2 -8 15 267 
after:	4 -3 3 -7 16 268 
sum:	281

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 475 C++98 es war unklar, ob f die Elemente der Sequenz
modifizieren darf, über die iteriert wird ( for_each ist
als "nicht-modifizierende Sequenzoperationen" klassifiziert)
klargestellt (erlaubt, wenn der
Iteratortyp mutable ist)
LWG 2747 C++11 Überladung ( 1 ) gab std :: move ( f ) zurück gibt f zurück (was implizit bewegt)

Siehe auch

wendet eine Funktion auf einen Elementbereich an und speichert die Ergebnisse in einem Zielbereich
(Funktions-Template)
(C++17)
wendet ein Funktionsobjekt auf die ersten N Elemente einer Sequenz an
(Funktions-Template)
wendet ein unäres Funktionsobjekt auf Elemente aus einem Bereich an
(Algorithmus-Funktionsobjekt)
wendet ein Funktionsobjekt auf die ersten N Elemente einer Sequenz an
(Algorithmus-Funktionsobjekt)
Range- for -Schleife (C++11) führt Schleife über Bereich aus