Namensräume
Varianten
Aktionen

std::experimental::ranges::for_each

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
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 Funktions-Objekt f für das Ergebnis der Auswertung des Projekters proj beim Dereferenzieren jedes Iterators im Bereich [firstlast) auf (d.h. ranges::invoke(f, ranges::invoke(proj, *i))), in Reihenfolge.
2) Entspricht (1), verwendet aber r als Quellbereich, so als ob ranges::begin(r) als first und ranges::end(r) als last verwendet würden.

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::in ist der past-the-end-Iterator des Quellbereichs (d.h. ein Iterator vom Typ I, der gleich dem Sentinel last ist).
  • Der zweite Member mit dem Tag tag::fun wird aus std::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

[bearbeiten] Siehe auch

Wendet eine Funktion auf einen Elementbereich an
(Funktionsvorlage) [bearbeiten]
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
(Funktionstempelat) [edit]