Namespaces
Variants

std::max

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジのアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対して)
集合操作 (ソート済み範囲に対して)
マージ操作 (ソート済み範囲に対して)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダ <algorithm>
template< class T >
const T& max( const T& a, const T& b );
で定義 (1) (C++14以降 constexpr)
template< class T, class Compare >
const T& max( const T& a, const T& b, Compare comp );
(2) (C++14以降 constexpr)
template< class T >
T max( std::initializer_list<T> ilist );
(3) (C++11以降)
(C++14以降 constexpr)
template< class T, class Compare >
T max( std::initializer_list<T> ilist, Compare comp );
(4) (C++11以降)
(C++14以降 constexpr)

指定された値のうち大きい方を返します。

1,2) a と b の大きい方を返します。
1) 値の比較には operator< を使用します。
T が LessThanComparable でない場合、動作は未定義です。
2) 比較関数 comp を使用して値を比較します。
3,4) 初期化子リスト ilist 内の値のうち最大のものを返します。
ilist.size() が 0 の場合、または T が CopyConstructible でない場合、動作は未定義です。
3) 値の比較には operator< を使用します。
T が LessThanComparable でない場合、動作は未定義です。
4) 比較関数 comp を使用して値を比較します。

引数

a, b - 比較する値
ilist - 比較する値を含む初期化子リスト
comp - 比較関数オブジェクト (つまり、Compare の要件を満たすオブジェクト)。true が a よりも 小さい 場合に b を返します。

比較関数のシグネチャは以下と同等である必要があります:

bool cmp(const Type1& a, const Type2& b);

シグネチャに const& が含まれている必要はありませんが、関数は渡されたオブジェクトを変更してはならず、すべての型 (const の場合もある) Type1 および Type2 の値を 値カテゴリ に関係なく受け入れられなければなりません (したがって、Type1& は許可されません。また、Type1 は、Type1 移動がコピーと同等である場合を除き、許可されません(C++11以降))。
型 Type1 および Type2 は、型 T のオブジェクトがそれらの両方に暗黙的に変換可能であるようにしなければなりません。

戻り値

1,2) a と b の大きい方。等しい場合は a を返します。
3,4) ilist 内の最大値。最大値と等しい値が複数ある場合は、最も左のものを返します。

計算量

1) operator< を使用した比較がちょうど 1 回。
2) 比較関数 comp の適用がちょうど 1 回。
3,4) N を ilist.size() とすると:
3) N-1 回の operator< を使用した比較。
4) N-1 回の比較関数 comp の適用。

実装例

max (1)
template<class T> 
const T& max(const T& a, const T& b)
{
    return (a < b) ? b : a;
}
max (2)
template<class T, class Compare> 
const T& max(const T& a, const T& b, Compare comp)
{
    return (comp(a, b)) ? b : a;
}
max (3)
template<class T>
T max(std::initializer_list<T> ilist)
{
    return *std::max_element(ilist.begin(), ilist.end());
}
max (4)
template<class T, class Compare>
T max(std::initializer_list<T> ilist, Compare comp)
{
    return *std::max_element(ilist.begin(), ilist.end(), comp);
}

注記

std::max の結果を参照でキャプチャすると、引数のいずれかが一時オブジェクトでその引数が返された場合に、ダングリング参照が発生します:

int n = -1;
const int& r = std::max(n + 2, n * 2); // r is dangling

例

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string_view>

int main()
{
    auto longest = [](const std::string_view s1, const std::string_view s2)
                   {
                       return s1.size() < s2.size();
                   };
    
    std::cout << "Larger of 69 and 96 is " << std::max(69, 96) << "\n"
                 "Larger of 'q' and 'p' is '" << std::max('q', 'p') << "'\n"
                 "Largest of 010, 10, 0X10, and 0B10 is "
              << std::max({010, 10, 0X10, 0B10}) << '\n'
              << R"(Longest of "long", "short", and "int" is )"
              << std::quoted(std::max({"long", "short", "int"}, longest)) << '\n';
}

出力:

Larger of 69 and 96 is 96
Larger of 'q' and 'p' is 'q'
Largest of 010, 10, 0X10, and 0B10 is 16
Longest of "long", "short", and "int" is "short"

欠陥報告

以下の動作を変更する欠陥報告は、以前に公開された C++ 標準に遡って適用されました。

DR 適用先 公開時の動作 正しい動作
LWG 281 C++98 T はオーバーロード (1,2) に対して CopyConstructible である必要があった
不要 LWG 2239
C++98
C++11 T1. はオーバーロード (
    2) (C++98) および (4) (C++11) に対して LessThanComparable である必要があった
2. 計算量の要件が欠落していた
1. 不要
2. 要件を追加

関連項目

指定された値のうち小さい方を返す
(関数テンプレート & アルゴリズム関数オブジェクト)
(C++11)
2つの要素のうち小さい方と大きい方を返す
(関数テンプレート & アルゴリズム関数オブジェクト)
範囲内の最大の要素を返す
(関数テンプレート & アルゴリズム関数オブジェクト)
(C++17)
値を境界値のペアの間にクランプする
(関数テンプレート & アルゴリズム関数オブジェクト)
指定された値のうち大きい方を返す
(アルゴリズム関数オブジェクト)