Namespaces
Variants

std::valarray<T>::apply

Von de.cppreference.net
 
 
 
 
valarray<T> apply( T func(T) ) const;
valarray<T> apply( T func(const T&) ) const;

Gibt ein neues valarray derselben Größe zurück, dessen Werte durch Anwenden der Funktion func auf die vorherigen Werte der Elemente.

Parameter

func - Funktion, die auf die Werte angewendet wird

Rückgabewert

Das resultierende valarray mit Werten, die durch Anwendung der Funktion func erworben wurden.

Hinweise

Die Funktion kann mit einem von std::valarray abweichenden Rückgabetyp implementiert werden. In diesem Fall hat der Ersatztyp die folgenden Eigenschaften:

  • Alle const Memberfunktionen von std::valarray werden bereitgestellt.
  • std::valarray, std::slice_array, std::gslice_array, std::mask_array und std::indirect_array können aus dem Ersatztyp konstruiert werden.
  • Für jede Funktion, die einen const std::valarray<T>& entgegennimmt, mit Ausnahme von begin() und end()(seit C++11), werden identische Funktionen, die die Ersatztypen entgegennehmen, hinzugefügt;
  • Für jede Funktion, die zwei const std::valarray<T>& Argumente entgegennimmt, werden identische Funktionen hinzugefügt, die jede Kombination von const std::valarray<T>& und Ersatztypen entgegennehmen.
  • Der Rückgabetyp fügt nicht mehr als zwei Ebenen der Templateschachtelung über dem am tiefsten geschachtelten Argumenttyp hinzu.

Mögliche Implementierung

Die folgenden einfachen Implementierungen können durch Expression Templates für eine höhere Effizienz ersetzt werden.

template<class T>
valarray<T> valarray<T>::apply(T func(T)) const
{
    valarray<T> other = *this;
    for (T& i : other)
        i = func(i);
    return other;
}
template<class T>
valarray<T> valarray<T>::apply(T func(const T&)) const
{
    valarray<T> other = *this;
    for (T& i : other)
        i = func(i);
    return other;
}

Beispiel

Berechnet und gibt die ersten 10 Fakultäten aus.

#include <cmath>
#include <iostream>
#include <valarray>
int main()
{
    std::valarray<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    v = v.apply([](int n) -> int
                {
                    return std::round(std::tgamma(n + 1));
                });
    for (auto n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

Ausgabe:

1 2 6 24 120 720 5040 40320 362880 3628800

Siehe auch

wendet ein unäres Funktionsobjekt auf Elemente aus einem Bereich
(Funktionsschablone & Algorithmus-Funktionsobjekt)
wendet ein unäres Funktionsobjekt auf Elemente aus einem Bereich
(Algorithmus-Funktionsobjekt)