Namespaces
Variants

std::minmax

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

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


 
ヘッダ <algorithm>
template< class T >
std::pair<const T&, const T&> minmax( const T& a, const T& b );
で定義 (1) (C++11から)
(C++14からconstexpr)
template< class T, class Compare >
std::pair<const T&, const T&> minmax( const T& a, const T& b,
                                      Compare comp );
(2) (C++11から)
(C++14からconstexpr)
template< class T >
std::pair<T, T> minmax( std::initializer_list<T> ilist );
(3) (C++11から)
(C++14からconstexpr)
template< class T, class Compare >
std::pair<T, T> minmax( 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() がゼロであるか、T が CopyConstructible でない場合、動作は未定義です。
3) 値の比較に operator< を使用します。
T が LessThanComparable でない場合、動作は未定義です。
4) 値の比較に比較関数 comp を使用します。

パラメータ

a, b - 比較する値
ilist - 比較する値を含む初期化子リスト
comp - 比較関数オブジェクト(すなわち Compare 要件を満たすオブジェクト)。最初の引数が2番目の引数より 小さい 場合に true を返す。

比較関数のシグネチャは以下と同等であるべき:

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 が b と等価である場合、 std:: pair < const T & , const T & > ( a, b ) の結果を返す。 b < a の場合、 std:: pair < const T & , const T & > ( b, a ) の結果を返す。
3,4) 最小値を持つ要素を最初の要素、最大値を持つ要素を2番目の要素とするペア。最小値に等しい要素が複数ある場合、最も左の要素が返されます。最大値に等しい要素が複数ある場合、最も右の要素が返されます。

計算量

1) 正確に1回の比較を operator < を使用して行う。
2) 比較関数の適用は正確に1回 comp .
3,4) 与えられた N は ilist. size ( ) として:
3) 最大
3N
2
回の比較を operator < を使用して行う。
4) 最大で
3N
2
回の比較関数 comp の適用。

実装例

minmax (1)
template<class T>
constexpr std::pair<const T&, const T&> minmax(const T& a, const T& b)
{
    return (b < a) ? std::pair<const T&, const T&>(b, a)
                   : std::pair<const T&, const T&>(a, b);
}
minmax (2)
template<class T, class Compare>
constexpr std::pair<const T&, const T&> minmax(const T& a, const T& b, Compare comp)
{
    return comp(b, a) ? std::pair<const T&, const T&>(b, a)
                      : std::pair<const T&, const T&>(a, b);
}
minmax (3)
template<class T>
constexpr std::pair<T, T> minmax(std::initializer_list<T> ilist)
{
    auto p = std::minmax_element(ilist.begin(), ilist.end());
    return std::pair(*p.first, *p.second);
}
minmax (4)
template<class T, class Compare>
constexpr std::pair<T, T> minmax(std::initializer_list<T> ilist, Compare comp)
{
    auto p = std::minmax_element(ilist.begin(), ilist.end(), comp);
    return std::pair(*p.first, *p.second);
}

注記

オーバーロード ( 1,2 ) の場合、パラメータのいずれかが一時オブジェクトである場合、返される参照は minmax の呼び出しを含む完全式の終了時にダングリング参照となります:

int n = 1;
auto p = std::minmax(n, n + 1);
int m = p.first; // 正常
int x = p.second; // 未定義動作
// 構造化束縛でも同様の問題が発生することに注意
auto [mm, xx] = std::minmax(n, n + 1);
xx; // 未定義動作

例

#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
int main()
{
    std::vector<int> v{3, 1, 4, 1, 5, 9, 2, 6};
    std::srand(std::time(0));
    std::pair<int, int> bounds = std::minmax(std::rand() % v.size(),
                                             std::rand() % v.size());
    std::cout << "v[" << bounds.first << "," << bounds.second << "]: ";
    for (int i = bounds.first; i < bounds.second; ++i)
        std::cout << v[i] << ' ';
    std::cout << '\n';
}

出力例:

v[2,7]: 4 1 5 9 2

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR Applied to Behavior as published Correct behavior
LWG 2239 C++11 T は LessThanComparable 要件を満たすことが要求されていた(オーバーロード ( 2,4 ) の場合) 要求されない

関連項目

与えられた値のうち小さい方を返す
(関数テンプレート& アルゴリズム関数オブジェクト)
与えられた値のうち大きい方を返す
(関数テンプレート& アルゴリズム関数オブジェクト)
範囲内の最小要素と最大要素を返す
(関数テンプレート& アルゴリズム関数オブジェクト)
2つの要素のうち小さい方と大きい方を返す
(アルゴリズム関数オブジェクト)