namespace std::ranges {
template <class T,
class Proj = identity,
indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
constexpr const T&
min(const T& a,
const T& b,
Comp comp = {},
Proj proj = {}); // (1) C++20
template <copyable T,
class Proj = identity,
indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
constexpr T
min(initializer_list<T> r,
Comp comp = {},
Proj proj = {}); // (2) C++20
template <input_range R,
class Proj = identity,
indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
constexpr range_value_t<R>
min(R&& r,
Comp comp = {},
Proj proj = {}); // (3) C++20
}
概要
同じ型の2つの値、もしくは範囲によるN個の値のうち、最小値を取得する。
- (1): 2つの値を指定する
- (2): 初期化子リストを指定する
- (3): Rangeを指定する
戻り値
比較 invoke(comp,invoke(proj, *i),invoke(proj, *j))
によって最小と判断された最初の値
備考
- 等価な要素が 2 つ以上あった場合には、最も左の要素を返す。
例
#include <array>
#include <algorithm>
#include <functional>
int main()
{
constexpr int result1 = std::ranges::min(2, 3);
static_assert(result1 == 2);
constexpr int result2 = std::ranges::min(2, 3, std::ranges::greater());
static_assert(result2 == 3);
constexpr int result3 = std::ranges::min({1, 2, 3});
static_assert(result3 == 1);
constexpr std::array<int, 3> a = {1, 2, 3};
constexpr int result4 = std::ranges::min(a, std::ranges::greater());
static_assert(result4 == 3);
}
出力
備考
Windows環境においては、<windows.h>
をインクルードするとmin
という名前の関数マクロが定義され、std::ranges::min()
と衝突してしまうという問題がある。
この解決策として以下の2つの方法がある:
<windows.h>
をインクルードするまでに#define NOMINMAX
を行う。これでmin
マクロが定義されなくなる。std::ranges::min()
を呼び出す際に、(std::ranges::min)(a, b);
のように関数名をカッコで囲んで使用する。これで、名前解決においてstd::ranges::min()
が必ず使用される。
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 10.1.0 ✅
- ICC: ??
- Visual C++: 2019 Update 10 ✅