namespace std::ranges {
template <forward_iterator I,
sentinel_for<I> S,
class Proj = identity,
indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
constexpr minmax_element_result<I>
minmax_element(I first,
S last,
Comp comp = {},
Proj proj = {}); // (1) C++20
template <forward_range R,
class Proj = identity,
indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
constexpr minmax_element_result<borrowed_iterator_t<R>>
minmax_element(R&& r,
Comp comp = {},
Proj proj = {}); // (2) C++20
template <execution-policy Ep,
random_access_iterator I,
sized_sentinel_for<I> S,
class Proj = identity,
indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
minmax_element_result<I>
minmax_element(Ep&& exec,
I first,
S last,
Comp comp = {},
Proj proj = {}); // (3) C++26
template <execution-policy Ep,
sized-random-access-range R,
class Proj = identity,
indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
minmax_element_result<borrowed_iterator_t<R>>
minmax_element(Ep&& exec,
R&& r,
Comp comp = {},
Proj proj = {}); // (4) C++26
}
概要
[first, last) の範囲において、最小要素を指すイテレータと最大要素を指すイテレータの組を取得する。
- (1): イテレータ範囲を指定する
- (2): Rangeを直接指定する
- (3): (1)の並列アルゴリズム版。実行ポリシーを指定する
- (4): (2)の並列アルゴリズム版。実行ポリシーを指定する
戻り値
minmax_element_result {
.min = 最小の要素を指すイテレータ,
.max = 最大の要素を指すイテレータ,
}
それぞれ、比較 invoke(comp, invoke(proj, *i), invoke(proj, *j)) によって判断し、同じ値の要素が複数ある場合は、最小の要素は最初の要素、最大の要素は最後の要素となる。
計算量
n を範囲の要素数とする場合、max(floor(3(n - 1) / 2), 0) 回の述語適用を行う。
例
基本的な使い方
#include <cassert>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> v = {3, 1, 4};
auto [min1, max1] = std::ranges::minmax_element(v);
assert(*min1 == 1);
assert(*max1 == 4);
auto [min2, max2] = std::ranges::minmax_element(v, std::ranges::greater());
assert(*min2 == 4);
assert(*max2 == 1);
}
出力
並列アルゴリズムの例 (C++26)
#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>
int main()
{
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};
// 並列に最小要素と最大要素を同時に検索する
auto [min_it, max_it] = std::ranges::minmax_element(std::execution::par, v);
std::cout << "min: " << *min_it << std::endl;
std::cout << "max: " << *max_it << std::endl;
}
出力
min: 1
max: 9
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1.0 ✅
- ICC: ??
- Visual C++: 2019 Update 10 ✅