std::valarray<T>:: apply
|
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 Anwendung der Funktion
func
auf die vorherigen Werte der Elemente erzeugt wurden.
Inhaltsverzeichnis |
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 Rückgabetyp implementiert werden, der sich von std::valarray unterscheidet. 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 ein const std:: valarray < T > & außer begin() und end() (seit C++11) entgegennimmt, müssen identische Funktionen hinzugefügt werden, die die Ersatztypen akzeptieren;
- Für jede Funktion, die zwei const std:: valarray < T > & Argumente entgegennimmt, müssen identische Funktionen hinzugefügt werden, die jede Kombination von const std:: valarray < T > & und Ersatztypen akzeptieren.
- Der Rückgabetyp fügt nicht mehr als zwei Ebenen von Template-Verschachtelung über dem am tiefsten verschachtelten 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 eines
Bereichs
an
(Funktions-Template) |
|
|
(C++20)
|
wendet ein unäres
Funktionsobjekt
auf Elemente eines
Bereichs
an
(Algorithmus-Funktionsobjekt) |