std::experimental::ranges::for_each
| Definiert in Header <experimental/ranges/algorithm> |
||
| template< InputIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectUnaryInvocable<projected<I, Proj>> Fun > |
(1) | (Ranges TS) |
| template< InputRange R, class Proj = ranges::identity, IndirectUnaryInvocable<projected<ranges::iterator_t<R>, Proj>> Fun > |
(2) | (Ranges TS) |
[first, last) auf (d.h. ranges::invoke(f, ranges::invoke(proj, *i))), in Reihenfolge.Bei beiden Überladungen gilt: Wenn der Iteratortyp veränderbar ist, kann f die Elemente des Bereichs über den dereferenzierten Iterator modifizieren. Wenn f ein Ergebnis zurückgibt, wird dieses ignoriert.
Im Gegensatz zu den übrigen Algorithmen darf for_each keine Kopien der Elemente in der Sequenz erstellen, selbst wenn diese trivial kopierbar sind.
Im Gegensatz zu std::for_each (das nur MoveConstructible erfordert), erfordern diese Funktionen, dass Fun CopyConstructible modelliert.
Ungeachtet der oben gezeigten Deklarationen ist die tatsächliche Anzahl und Reihenfolge der Template-Parameter für Algorithmusdeklarationen nicht spezifiziert. Wenn also explizite Template-Argumente beim Aufruf eines Algorithmus verwendet werden, ist das Programm wahrscheinlich nicht portabel.
Inhalt |
[bearbeiten] 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 wird |
[bearbeiten] Rückgabewert
Ein tagged_pair-Objekt, das die folgenden zwei Member enthält:
- Der erste Member mit dem Tag
tag::inist der past-the-end-Iterator des Quellbereichs (d.h. ein Iterator vom TypI, der gleich dem Sentinel last ist). - Der zweite Member mit dem Tag
tag::funwird ausstd::move(f)initialisiert (nach allen Anwendungen des Funktions-Objekts).
[bearbeiten] Komplexität
Genau last - first Anwendungen von f und proj.
[bearbeiten] 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)}; } |
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Siehe auch
| Wendet eine Funktion auf einen Elementbereich an (Funktionsvorlage) | |
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++17) |
Wendet ein Funktionsobjekt auf die ersten N Elemente einer Sequenz an (Funktionstempelat) |