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,
Compare comp );
|
(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.
operator<(bis C++20)std::less{}(seit C++20) zum Vergleichen der Werte.comp zum Vergleichen der Werte.Wenn lo größer als hi ist, ist das Verhalten undefiniert.
- ↑ Wenn
NaNvermieden wird, kannTein Gleitkommatyp sein.
Parameter
| v | - | der zu begrenzende Wert |
| lo, hi | - | die Grenzen, auf die v begrenzt wird
|
| comp | - | Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von Compare erfüllt), das true zurückgibt, wenn das erste Argument kleiner als das zweite ist.Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen:
Während die Signatur nicht |
Rückgabewert
Verweis auf lo, wenn v kleiner als lo ist, Verweis auf hi, wenn hi kleiner als v ist, andernfalls Verweis auf v.
Komplexität
operator<(bis C++20)std::less{}(seit C++20).comp.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;
}
|
Anmerkungen
Das Erfassen des Ergebnisses von 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 ist, wird ein Verweis auf v zurückgegeben, nicht auf die Grenze.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_clamp |
201603L |
(C++17) | std::clamp
|
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
Siehe auch
| gibt den kleineren der angegebenen Werte zurück (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
| gibt den größeren der angegebenen Werte zurück (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
(C++20) |
prüft, ob ein ganzzahliger Wert im Bereich eines gegebenen Ganzzahltyps liegt (Funktionsschablone) |
(C++20) |
begrenzt einen Wert zwischen einem Paar von Grenzwerten (Algorithmus-Funktionsobjekt) |