Namespaces
Variants

std::experimental::ranges:: for_each

From cppreference.net
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryInvocable < projected < I, Proj >> Fun >
ranges:: tagged_pair < tag:: in ( I ) , tag:: fun ( Fun ) >

for_each ( I first, S last, Fun f, Proj proj = Proj { } ) ;
(1) (ranges TS)
template < InputRange R, class Proj = ranges:: identity ,

IndirectUnaryInvocable < projected < ranges:: iterator_t < R > , Proj >> Fun >
ranges:: tagged_pair < tag:: in ( ranges:: safe_iterator_t < R > ) , tag:: fun ( Fun ) >

for_each ( R && r, Fun f, Proj proj = Proj { } ) ;
(2) (ranges TS)
1) Ruft das gegebene Funktionsobjekt f mit dem Ergebnis des Aufrufs der Projektion proj auf das Dereferenzieren jedes Iterators im Bereich [ first , last ) auf (d.h. ranges:: invoke ( f, ranges:: invoke ( proj, * i ) ) ), in Reihenfolge.
2) Gleich wie (1) , verwendet jedoch r als Quellbereich, als ob ranges:: begin ( r ) als first und ranges:: end ( r ) als last verwendet würde.

Für beide Überladungen gilt: Wenn der Iteratortyp veränderbar ist, f kann die Elemente des Bereichs durch den dereferenzierten Iterator modifizieren. Wenn f ein Ergebnis zurückgibt, wird das Ergebnis ignoriert.

Im Gegensatz zu den restlichen Algorithmen ist es for_each nicht gestattet, Kopien der Elemente in der Sequenz zu erstellen, selbst wenn sie trivial kopierbar sind.

Im Gegensatz zu std::for_each (welches nur MoveConstructible erfordert), benötigen diese Funktionen, dass Fun das Konzept CopyConstructible modelliert.

Ungeachtet der oben dargestellten Deklarationen sind die tatsächliche Anzahl und Reihenfolge der Template-Parameter für Algorithmusdeklarationen nicht spezifiziert. Daher ist das Programm wahrscheinlich nicht portabel, wenn explizite Template-Argumente beim Aufruf eines Algorithmus verwendet werden.

Inhaltsverzeichnis

Parameter

first, last - der Bereich, auf den die Funktion angewendet werden soll
r - der Bereich, auf den die Funktion angewendet werden soll
f - aufrufbares Objekt, das auf jedes projizierte Element im Bereich angewendet werden soll
proj - Projektion, die auf die Elemente angewendet werden soll

Rückgabewert

Ein tagged_pair -Objekt, das die folgenden zwei Elemente enthält:

  • Das erste Element, mit dem Tag tag::in , ist der Past-the-End-Iterator des Quellbereichs (also ein Iterator vom Typ I , der gleich dem Sentinel last ist).
  • Das zweite Element, mit dem Tag tag::fun , wird von std::move(f) initialisiert (nach allen Anwendungen des Funktionsobjekts).

Komplexität

Genau last - first Anwendungen von f und proj .

Mögliche Implementierung

template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryInvocable<ranges::projected<I, Proj>> Fun>
auto for_each(I first, S last, Fun f, Proj proj = Proj{}) 
    -> ranges::tagged_pair<tag::in(I), tag::fun(Fun)>
{
    for (; first != last; ++first)
        ranges::invoke(f, ranges::invoke(proj, *first));
    return {std::move(first), std::move(f)};
}

Beispiel

Siehe auch

wendet eine Funktion auf einen Elementbereich an
(Funktionsschablone)
Bereichs- for -Schleife (C++11) führt Schleife über Bereich aus
wendet ein unäres Funktionsobjekt auf Elemente eines Bereichs an
(Funktionsschablone)
(C++17)
wendet ein Funktionsobjekt auf die ersten N Elemente einer Sequenz an
(Funktionsschablone)