目次
はじめに
プログラミングでは、計算結果やユーザーの入力値が、意図した範囲(例えば0〜100)に収まっていることを保証したい、という場面がよくあります。従来は、if文を使って「もし最小値より小さければ最小値に、もし最大値より大きければ最大値にする」というコードを自分で書く必要がありました。
C++17では、このための標準関数 std::clamp が <algorithm> ヘッダーに追加されました。clamp を使えば、この「値を範囲内に収める(クランプする)」処理を、一行で、意図が明確な形で記述できます。
【前提】C++17とは?
C++17(シーピープラスいちなな)は、2017年に正式化されたC++言語の規格です。std::clamp はこのC++17で追加された機能のため、利用するにはC++17に対応したコンパイラが必要です。
clamp を使ったサンプルコード
このコードは、いくつかの入力値に対して、10 から 20 までの範囲で clamp を適用し、その結果を出力します。
完成コード
#include <iostream>
#include <algorithm> // std::clamp
using namespace std;
int main() {
const int min_val = 10;
const int max_val = 20;
int input1 = 5; // 範囲より小さい
int input2 = 15; // 範囲内
int input3 = 25; // 範囲より大きい
// clamp(値, 最小値, 最大値)
int result1 = clamp(input1, min_val, max_val);
int result2 = clamp(input2, min_val, max_val);
int result3 = clamp(input3, min_val, max_val);
cout << input1 << " -> clamp(x, 10, 20) -> " << result1 << endl;
cout << input2 << " -> clamp(x, 10, 20) -> " << result2 << endl;
cout << input3 << " -> clamp(x, 10, 20) -> " << result3 << endl;
return 0;
}
実行結果
5 -> clamp(x, 10, 20) -> 10
15 -> clamp(x, 10, 20) -> 15
25 -> clamp(x, 10, 20) -> 20
コードの解説
clamp(value, low, high)
- 機能: 第1引数
valueの値を、第2引数lowと第3引数highで定義される閉区間[low, high]の範囲内に収めます。 - 動作:
- もし
valueがlowより小さい場合、lowを返します。 - もし
valueがhighより大きい場合、highを返します。 - もし
valueがlowとhighの間にある場合、valueそのものを返します。
- もし
- 注意点:
lowがhighより大きい場合の動作は未定義です。必ずlow <= highとなるように値を指定する必要があります。
まとめ
今回は、C++17の std::clamp を使って、値を特定の範囲内に収める方法を解説しました。
<algorithm>ヘッダーをインクルードする。clamp(値, 最小値, 最大値)の形で呼び出す。
if文を複数書くよりも、clamp を使った方がコードが簡潔になり、「値を特定の範囲に制限したい」という意図が明確になります。
