std::clamp
| Определён в заголовке <algorithm>
|
||
template< class T >
constexpr const T& clamp( const T& v, const T& lo, const T& hi );
|
(1) | (начиная с C++17) |
template< class T, class Compare >
constexpr const T& clamp( const T& v, const T& lo, const T& hi,
Compare comp );
|
(2) | (начиная с C++17) |
Если значение v находится в пределах [lo, hi], возвращает v; в противном случае возвращает ближайшую границу.
operator<(до C++20)std::less{}(начиная с C++20) для сравнения значений.comp для сравнения значений.Если lo больше hi, поведение не определено.
- ↑ Если избежать
NaN,Tможет быть типом с плавающей запятой.
Параметры
| v | - | значение для ограничения |
| lo, hi | - | границы для ограничения v до
|
| comp | - | объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true, если первый аргумент меньше второго.Сигнатура функции сравнения должна быть эквивалентна следующей:
Хотя сигнатура не обязательно должна содержать |
Возвращаемое значение
Ссылка на lo, если v меньше lo, ссылка на hi, если hi меньше v, в противном случае ссылка на v.
Сложность
operator<(до C++20)std::less{}(начиная с C++20).comp.Возможная реализация
| 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;
}
|
Примечания
Захват результата std::clamp по ссылке приводит к висячей ссылке, если один из параметров является временным объектом и этот параметр возвращается:
int n = -1;
const int& r = std::clamp(n, 0, 255); // r is dangling
Если v эквивалентно одной из границ, возвращается ссылка на v, а не на границу.
| Макрос проверки возможности | Значение | Стандарт | Особенность |
|---|---|---|---|
__cpp_lib_clamp |
201603L |
(C++17) | std::clamp
|
Пример
#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';
}
Вывод:
[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
См. также
| возвращает меньшее из заданных значений (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
| возвращает большее из заданных значений (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
(C++20) |
проверяет, находится ли целое значение в диапазоне заданного целочисленного типа (шаблон функции) |
(C++20) |
ограничивает значение между парой граничных значений (объект функции алгоритма) |