std::clamp
| Definiert in Header <algorithm> |
||
template< class T > constexpr const T& clamp( const T& v, const T& lo, const T& hi ); |
(1) | (seit C++17) |
template< class T, class Compare > constexpr const T& clamp( const T& v, const T& lo, const T& hi, |
(2) | (seit C++17) |
Wenn der Wert von v innerhalb von [lo, hi] liegt, wird v zurückgegeben; andernfalls wird die nächstgelegene Grenze zurückgegeben.
Wenn lo größer ist als hi, ist das Verhalten undefiniert.
- ↑ Wenn
NaNvermieden wird, kannTein Fließkommatyp sein.
Inhalt |
[bearbeiten] Parameter
| v | - | der zu klemmende Wert |
| lo, hi | - | die Grenzen, auf die v geklemmt werden soll |
| comp | - | Ein Vergleichsfunktions-Objekt (d.h. ein Objekt, das die Anforderungen an Compare erfüllt), das true zurückgibt, wenn das erste Argument *weniger* als das zweite ist. Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein bool cmp(const Type1& a, const Type2& b); Obwohl die Signatur nicht const& haben muss, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (möglicherweise const) |
[bearbeiten] Rückgabewert
Referenz auf lo, wenn v kleiner ist als lo, Referenz auf hi, wenn hi kleiner ist als v, andernfalls Referenz auf v.
[bearbeiten] Komplexität
[bearbeiten] Mögliche Implementierung
| clamp (1) |
|---|
template<class T> constexpr const T& clamp(const T& v, const T& lo, const T& hi) { return clamp(v, lo, hi, less{}); } |
| clamp (2) |
template<class T, class Compare> constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp) { return comp(v, lo) ? lo : comp(hi, v) ? hi : v; } |
[bearbeiten] Hinweise
std::clamp per Referenz erzeugt eine hängende Referenz, wenn einer der Parameter ein temporäres Objekt ist und dieser Parameter zurückgegeben wird.int n = -1; const int& r = std::clamp(n, 0, 255); // r is dangling
Wenn v äquivalent zu einer der Grenzen verglichen wird, wird eine Referenz auf v zurückgegeben, nicht auf die Grenze.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_clamp |
201603L |
(C++17) | std::clamp
|
[bearbeiten] Beispiel
#include <algorithm> #include <cstdint> #include <iomanip> #include <iostream> int main() { std::cout << "[raw] " "[" << INT8_MIN << ',' << INT8_MAX << "] " "[0," << UINT8_MAX << "]\n"; for (const int v : {-129, -128, -1, 0, 42, 127, 128, 255, 256}) std::cout << std::setw(4) << v << std::setw(11) << std::clamp(v, INT8_MIN, INT8_MAX) << std::setw(8) << std::clamp(v, 0, UINT8_MAX) << '\n'; }
Ausgabe
[raw] [-128,127] [0,255] -129 -128 0 -128 -128 0 -1 -1 0 0 0 0 42 42 42 127 127 127 128 127 128 255 127 255 256 127 255
[bearbeiten] Siehe auch
| Gibt den kleineren der beiden Werte zurück (Funktionstemplate) | |
| Gibt den größeren der beiden Werte zurück (Funktionstemplate) | |
| (C++20) |
prüft, ob ein Ganzzahlwert im Bereich eines gegebenen Ganzzahltyps liegt (Funktionsvorlage) |
| (C++20) |
klemmt einen Wert zwischen einem Paar von Grenzwerte (Algorithmus-Funktionsobjekt) |