std::clamp in C++ 17

07 Aug, 2017
Clamps a variable to a given range[high – low].
If num > high, num is assigned high.
If num < low, num is assigned low.
If num is already clamped, no modifications.
Note : This function is defined in header from C++17 onwards.
Examples:
Input : num = 100, Range : 10 - 90
Output : num = 90

Input : num = 5, Range : 10 - 90
Output : num = 10

Input : num = 50, Range : 10 - 90
Output : num = 50

Syntax :
templateconstexpr const T& clamp( const T& num, const T& low, const T& high );
template
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp );
Parameters
num      -    the value to clamp
low, high  -    the boundaries to clamp num to
comp      -    comparison function object which returns ?true if low is less than num
                and num is less than high. 

Return value
Reference to low if num is less than low,
Reference to high if high is less than num,
otherwise reference to num.

Applications :
To keep a list of inputs specified to a given range. 
Preventing size overflow.

// CPP program to illustrate// std::clamp#include <bits/stdc++.h>  // Driver codeint main(){    // range [10 - 100]    int high = 100, low = 10;      // num1 higher than range    int num1 = 120;      // num2 lower than range    int num2 = 5;      // num3 in range    int num3 = 50;      // clamping all variables    num1 = std::clamp(num1, low, high);    num2 = std::clamp(num2, low, high);    num3 = std::clamp(num3, low, high);      // printing result    std::cout << num1 << " " << num2 << " " << num3;}
Output:
100 10 50
// CPP program to illustrate clamping// array elements in given range#include <iostream>#include <algorithm>  // Range [30 - 60]int low = 30, high = 60;  // Function to clamp the elements in given rangevoid clamp_arr_in_range(int arr[], int n){    // Clamping the array elements    for (int i = 0; i < n; i++) {        arr[i] = std::clamp(arr[i], low, high);    }}  // Driver codeint main(){    // Array having elements to be clamped    int arr[] = { 10, 20, 30, 40, 50, 60, 70, 80 };      // Size of array    int n = sizeof(arr) / sizeof(arr[0]);      // Function call to clamp the elements    clamp_arr_in_range(arr, n);      // Printing the array    for (int i = 0; i < n; i++)        std::cout << arr[i] << " ";}
Output :
30 30 30 40 50 60 60 60

With Binary Predicate
// C++ program to implement std::clamp// with Binary Predicate  #include <bits/stdc++.h>  // Binary predicatebool comp(int a, int b){    return (a < b);}  // Driver codeint main(){    // range [10 - 100]    int high = 100, low = 10;      // num1 higher than range    int num1 = 120;      // num2 lower than range    int num2 = 5;      // num3 in range    int num3 = 50;      // clamping all variables    num1 = std::clamp(num1, low, high, comp);    num2 = std::clamp(num2, low, high, comp);    num3 = std::clamp(num3, low, high, comp);      // printing result    std::cout << num1 << " " << num2 << " " << num3;}
Output:
100 10 50
This article is contributed by Rohit Thapliyal. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
cpp-algorithm-library
STL
C++
STL
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Bitwise Operators in C/C++
Set in C++ Standard Template Library (STL)
vector erase() and clear() in C++
unordered_map in C++ STL
Inheritance in C++
Substring in C++
Priority Queue in C++ Standard Template Library (STL)
The C++ Standard Template Library (STL)
C++ Classes and Objects
Object Oriented Programming in C++