名前空間
変種
操作

std::minmax

提供: cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に対するアルゴリズム (C++20)
コンセプトとユーティリティ: std::sortable, std::projected, ...
制約付きアルゴリズム: std::ranges::copy, std::ranges::sort, ...
実行ポリシー (C++17)
非変更シーケンス操作
(C++11)(C++11)(C++11)
(C++17)
変更シーケンス操作
未初期化記憶域の操作
分割操作
ソート操作
(C++11)
二分探索操作
集合操作 (ソート済み範囲用)
ヒープ操作
(C++11)
最小/最大演算
minmax
(C++11)
(C++17)

順列
数値演算
C のライブラリ
 
ヘッダ <algorithm> で定義
(1)
template< class T >
std::pair<const T&,const T&> minmax( const T& a, const T& b );
(C++11以上)
(C++14未満)
template< class T >
constexpr std::pair<const T&,const T&> minmax( const T& a, const T& b );
(C++14以上)
(2)
template< class T, class Compare >

std::pair<const T&,const T&> minmax( const T& a, const T& b,

                                     Compare comp );
(C++11以上)
(C++14未満)
template< class T, class Compare >

constexpr std::pair<const T&,const T&> minmax( const T& a, const T& b,

                                               Compare comp );
(C++14以上)
(3)
template< class T >
std::pair<T,T> minmax( std::initializer_list<T> ilist);
(C++11以上)
(C++14未満)
template< class T >
constexpr std::pair<T,T> minmax( std::initializer_list<T> ilist);
(C++14以上)
(4)
template< class T, class Compare >
std::pair<T,T> minmax( std::initializer_list<T> ilist, Compare comp );
(C++11以上)
(C++14未満)
template< class T, class Compare >
constexpr std::pair<T,T> minmax( std::initializer_list<T> ilist, Compare comp );
(C++14以上)

指定された値のうち最も小さな値と最も大きな値を返します。

1-2) ab の小さい方および大きい方を指す参照を返します。
3-4) 初期化子リスト ilist 内の最も小さな値と最も大きな値を返します。

(1,3) のバージョンは値を比較するために operator< を使用し、 (2,4) のバージョンは指定された比較関数 comp を使用します。

目次

[編集] 引数

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

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

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

シグネチャが const & を持つ必要はありませんが、関数は渡されたオブジェクトを変更してはならず、値カテゴリに関わらず Type1 および Type2 型 (およびそれらの const 修飾された型) のすべての値を受理できなければなりません (そのため Type1 & は許されません。 また Type1 に対してムーブがコピーと同等でなければ Type1 も許されません (C++11以上))。
Type1 および Type2 は、どちらも T 型のオブジェクトから暗黙に変換可能なものでなければなりません。 ​

型の要件
-
オーバロード (1,3) を使用するためには TLessThanComparable の要件を満たさなければなりません。
-
オーバロード (3,4) を使用するためには TCopyConstructible の要件を満たさなければなりません。

[編集] 戻り値

1-2) a<b の場合、または ab と同等な場合は、 std::pair<const T&, const T&>(a, b) の結果を返します。 b<a の場合は、 std::pair<const T&, const T&>(b, a) の結果を返します。
3-4) ilist 内の最も小さな値を第1要素に持ち最も大きな値を第2要素に持つペア。 最も小さな同等な要素が複数ある場合は、最も左のそのような要素が返されます。 最も大きな同等な要素が複数ある場合は、最も右のそのような要素が返されます。

[編集] 計算量

1-2) ちょうど1回の比較。
3-4) 多くとも ilist.size() * 3 / 2 回の比較。

[編集] 実装例

1つめのバージョン
template<class T> 
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);
}
2つめのバージョン
template<class T, class Compare> 
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);
}
3つめのバージョン
template< class T >
std::pair<T, T> minmax( std::initializer_list<T> ilist )
{
    auto p = std::minmax_element(ilist.begin(), ilist.end());
    return std::make_pair(*p.first, *p.second);
}
4つめのバージョン
template< class T, class Compare >
std::pair<T, T> minmax( std::initializer_list<T> ilist, Compare comp )
{
    auto p = std::minmax_element(ilist.begin(), ilist.end(), comp);
    return std::make_pair(*p.first, *p.second);
}

[編集] ノート

オーバーロード (1,2) の場合、引数のいずれかが右辺値であれば、返された参照は、 minmax の呼び出しを含む完全式の終わりで、ダングリング参照になります。

int n = 1;
auto p = std::minmax(n, n+1);
int m = p.first; // ok
int x = p.second; // undefined behavior

[編集]

#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
 
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

[編集] 関連項目

指定された値の小さい方を返します
(関数テンプレート) [edit]
指定された値の大きい方を返します
(関数テンプレート) [edit]
指定範囲の最も小さな要素と最も大きな要素を返します
(関数テンプレート) [edit]