最終更新日時: 2026年02月05日 13時53分18秒 (JST)
Akira Takahashi が更新

履歴 編集

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

      template <execution-policy Ep,
                sized-random-access-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>*>
      range_value_t<R>
        min(Ep&& exec,
            R&& r,
            Comp comp = {},
            Proj proj = {}); // (4) C++26
    }

## 概要

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

- (1): 2つの値を指定する
- (2): 初期化子リストを指定する
- (3): Rangeを指定する
- (4): (3)の並列アルゴリズム版。実行ポリシーを指定する

## 戻り値

比較 `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++26)

    #include <algorithm>
    #include <execution>
    #include <iostream>
    #include <vector>

    int main() {
      std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};

      // 並列に最小値を取得
      int result = std::ranges::min(std::execution::par, v);
      std::cout << result << std::endl;
    }

#### 出力

    1

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1.0 ✅
- ICC: ??
- Visual C++: 2019 Update 10 ✅

## 参照

- N4861 25 Algorithms library
- P3179R9 C++ parallel range algorithms