目次
はじめに
プログラミングでは、計算結果やユーザーの入力値が、意図した範囲(例えば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
を使った方がコードが簡潔になり、「値を特定の範囲に制限したい」という意図が明確になります。