std::minmax_element
| ヘッダ <algorithm> で定義
|
||
| (1) | ||
template< class ForwardIt > std::pair<ForwardIt,ForwardIt> minmax_element( ForwardIt first, ForwardIt last ); |
(C++11以上) (C++17未満) |
|
template< class ForwardIt > constexpr std::pair<ForwardIt,ForwardIt> minmax_element( ForwardIt first, ForwardIt last ); |
(C++17以上) | |
template< class ExecutionPolicy, class ForwardIt > std::pair<ForwardIt,ForwardIt> minmax_element( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last ); |
(2) | (C++17以上) |
| (3) | ||
template< class ForwardIt, class Compare > std::pair<ForwardIt,ForwardIt> minmax_element( ForwardIt first, ForwardIt last, Compare comp ); |
(C++11以上) (C++17未満) |
|
template< class ForwardIt, class Compare > constexpr std::pair<ForwardIt,ForwardIt> minmax_element( ForwardIt first, ForwardIt last, Compare comp ); |
(C++17以上) | |
template< class ExecutionPolicy, class ForwardIt, class Compare > std::pair<ForwardIt,ForwardIt> minmax_element( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, Compare comp ); |
(4) | (C++17以上) |
範囲 [first, last) 内の最も小さな要素と最も大きな要素を探します。
operator< を用いて比較されます。comp を用いて比較されます。policy に従って実行されます。 これらのオーバーロードは、 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> が true でなければ、オーバーロード解決に参加しません。引数
| first, last | - | 調べる範囲を定義する前方イテレータ |
| policy | - | 使用する実行ポリシー。 詳細は実行ポリシーを参照してください |
| cmp | - | *a が *b より小さい場合に true を返す、比較関数オブジェクト (Compare の要件を満たすオブジェクト)。比較関数のシグネチャは以下と同等であるべきです。
シグネチャが |
| 型の要件 | ||
-ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。
| ||
戻り値
第1要素として最も小さな要素を指すイテレータを持ち第2要素として最も大きな要素を指すイテレータを持つペア。 範囲が空の場合は std::make_pair(first, first) を返します。 最も小さな同等な要素が複数ある場合は、最初のそのような要素を指すイテレータが返されます。 最も大きな同等な要素が複数ある場合は、最後のそのような要素を指すイテレータが返されます。
計算量
多くとも max(floor((3/2)*(N−1)), 0) 回の述語の適用、ただし N = std::distance(first, last) です。
例外
テンプレート引数 ExecutionPolicy を持つオーバーロードは以下のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外を投げ、
ExecutionPolicyが標準のポリシーのいずれかの場合は、 std::terminate が呼ばれます。 それ以外のあらゆるExecutionPolicyについては、動作は処理系定義です。 - アルゴリズムがメモリの確保に失敗した場合は、 std::bad_alloc が投げられます。
ノート
このアルゴリズムは std::make_pair(std::min_element(), std::max_element()) と異なります。 効率性だけでなく、このアルゴリズムは最も大きな最後の要素を探しますが、 std::max_element は最も大きな最初の要素を探します。
実装例
| 1つめのバージョン |
|---|
template<class ForwardIt>
std::pair<ForwardIt, ForwardIt>
minmax_element(ForwardIt first, ForwardIt last)
{
using value_type = typename std::iterator_traits<ForwardIt>::value_type;
return std::minmax_element(first, last, std::less<value_type>());
}
|
| 2つめのバージョン |
template<class ForwardIt, class Compare>
std::pair<ForwardIt, ForwardIt>
minmax_element(ForwardIt first, ForwardIt last, Compare comp)
{
auto min = first, max = first;
if (first == last || ++first == last)
return {min, max};
if (comp(*first, *min)) {
min = first;
} else {
max = first;
}
while (++first != last) {
auto i = first;
if (++first == last) {
if (comp(*i, *min)) min = i;
else if (!(comp(*i, *max))) max = i;
break;
} else {
if (comp(*first, *i)) {
if (comp(*first, *min)) min = first;
if (!(comp(*i, *max))) max = i;
} else {
if (comp(*i, *min)) min = i;
if (!(comp(*first, *max))) max = first;
}
}
}
return {min, max};
}
|
例
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
const auto v = { 3, 9, 1, 4, 2, 5, 9 };
const auto [min, max] = std::minmax_element(begin(v), end(v));
std::cout << "min = " << *min << ", max = " << *max << '\n';
}
出力:
min = 1, max = 9
関連項目
| 指定範囲の最も小さな要素を返します (関数テンプレート) | |
| 指定範囲の最も大きな要素を返します (関数テンプレート) |