std::minmax
| ヘッダ <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) |
与えられた値の最小値と最大値を返します。
a と b のうち、小さい方と大きい方への参照を返します。operator< を使用します。T が LessThanComparable でない場合、動作は未定義です。comp を使用します。ilist 内の値の最小値と最大値を返します。operator< を使用します。T が LessThanComparable でない場合、動作は未定義です。comp を使用します。パラメータ
| a, b | - | 比較する値 |
| ilist | - | 比較する値を含む初期化子リスト |
| comp | - |
比較関数オブジェクト(すなわち
Compare
要件を満たすオブジェクト)。最初の引数が2番目の引数より
小さい
場合に
true
を返す。
比較関数のシグネチャは以下と同等であるべき: bool cmp ( const Type1 & a, const Type2 & b ) ;
シグネチャが
const
&
を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、
値カテゴリ
に関係なく型(おそらくconst)
|
戻り値
a < b の場合、または a が b と等価である場合、
std::
pair
<
const
T
&
,
const
T
&
>
(
a, b
)
の結果を返す。
b < a の場合、
std::
pair
<
const
T
&
,
const
T
&
>
(
b, a
)
の結果を返す。
計算量
| 3N |
| 2 |
| 3N |
| 2 |
実装例
| minmax (1) |
|---|
| minmax (2) |
| 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
)
の場合)
|
要求されない |
関連項目
| 与えられた値のうち小さい方を返す (関数テンプレート& アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 与えられた値のうち大きい方を返す (関数テンプレート& アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++11) |
範囲内の最小要素と最大要素を返す (関数テンプレート& アルゴリズム関数オブジェクト) |
(C++20) |
|
(C++20) |
2つの要素のうち小さい方と大きい方を返す (アルゴリズム関数オブジェクト) |