最終更新日時(UTC):
が更新

履歴 編集

function template
<algorithm>

std::ranges::min(C++20)

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)

  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)

  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)
}

概要

同じ型の2つの値、もしくは範囲によるN個の値のうち、最小値を取得する。

戻り値

比較 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

処理系

参照