目次
はじめに
C++で、いくつかの値の中から最も小さい値や最も大きい値を見つけたい場合、if文をネストして比較していくのは手間がかかります。
C++の標準ライブラリ <algorithm> には、このための非常にシンプルな関数 std::min と std::max が用意されています。これらの関数は、2つの値を比較するだけでなく、C++11以降では初期化子リスト {} を使って、3つ以上の値の中から最小値・最大値を取得することもできます。
min / max を使ったサンプルコード
このコードは、minとmaxの基本的な使い方を、2つの引数の場合と、初期化子リストを使った3つ以上の引数の場合で示します。
完成コード
#include <iostream>
#include <algorithm> // min, max
#include <vector> // initializer_list を使うためにvectorなどをインクルードすると確実
using namespace std;
int main() {
// --- 1. 2つの値の比較 ---
cout << "--- 2つの値の比較 ---" << endl;
cout << "min(10, 20): " << min(10, 20) << endl; // -> 10
cout << "max(10, 20): " << max(10, 20) << endl; // -> 20
// --- 2. 3つ以上の値の比較 (初期化子リスト) ---
cout << "\n--- 3つ以上の値の比較 ---" << endl;
cout << "min({30, 10, 50, 20}): " << min({30, 10, 50, 20}) << endl; // -> 10
cout << "max({30, 10, 50, 20}): " << max({30, 10, 50, 20}) << endl; // -> 50
return 0;
}
コードの解説
1. 2つの値を比較する場合
min(a, b) / max(a, b)
- 機能: 2つの引数
aとbを比較し、小さい方 (min) または大きい方 (max) の値を返します。aとbが等しい場合はaを返します。
2. 3つ以上の値を比較する場合 (C++11以降)
min({値1, 値2, 値3, ...})
- 機能: 初期化子リスト
{}を使って、任意の個数の値を渡すことができます。関数は、そのリストの中から最小値または最大値を見つけて返します。 std::initializer_list: この構文は、内部的にはstd::initializer_listという特殊なコンテナを利用しています。
独自の比較ルールを使う
min と max は、オプションの引数として**比較関数(またはラムダ式)**を渡すことで、デフォルトの < 演算子以外のルールで比較することも可能です。
// 文字列を「長さ」で比較する例
string s1 = "short";
string s2 = "very long string";
auto compare_by_length = [](const string& a, const string& b) {
return a.length() < b.length();
};
cout << "短い文字列は: " << min(s1, s2, compare_by_length) << endl; // -> short
まとめ
今回は、C++の <algorithm> ライブラリが提供する、最小値・最大値を取得するための std::min と std::max を解説しました。
min(a, b),max(a, b): 2つの値を比較する。min({a, b, c}),max({a, b, c}): 3つ以上の値を比較する (C++11以降)。
if文で煩雑な比較コードを書く代わりに、これらの標準関数を使うことで、コードが簡潔になり、意図も明確になります。
