【C++】min_element, max_elementでコンテナの最小値・最大値を取得する方法

目次

はじめに

C++で、vector などのコンテナに格納された要素の中から、最小値最大値を探し出したい、という場面は非常に多くあります。自前でループを書いて探すこともできますが、C++の標準ライブラリ <algorithm> には、このための専用関数が用意されています。

  • std::min_element: 範囲内の最小要素を指すイテレータを返す。
  • std::max_element: 範囲内の最大要素を指すイテレータを返す。
  • std::minmax_element: 最小要素と最大要素の両方を、ペアで一度に返す。

この記事では、これらの関数を使って、コンテナから最小値・最大値を安全かつ効率的に取得する方法を解説します。


最小値・最大値を取得するサンプルコード

このコードは、vector に格納された数値の中から、min_element, max_element, minmax_element の3つの関数を使って、最小値と最大値を探し出し、その値を表示します。

完成コード

#include <iostream>
#include <vector>
#include <algorithm> // min_element, max_element, minmax_element

using namespace std;

int main() {
    vector<int> scores = {75, 92, 58, 100, 84, 65};

    // --- 1. min_element と max_element を個別に使う ---
    // min_elementは最小要素を指す「イテレータ」を返す
    auto min_it = min_element(scores.begin(), scores.end());
    // イテレータを間接参照(*)して、実際の値を取得
    cout << "最低点数 (min_element): " << *min_it << endl;

    // max_elementも同様に、最大要素を指すイテレータを返す
    auto max_it = max_element(scores.begin(), scores.end());
    cout << "最高点数 (max_element): " << *max_it << endl;

    cout << "--------------------" << endl;

    // --- 2. minmax_element を使って、一度に両方を取得する ---
    auto minmax_pair = minmax_element(scores.begin(), scores.end());
    
    cout << "最低点数 (minmax_element): " << *(minmax_pair.first) << endl;
    cout << "最高点数 (minmax_element): " << *(minmax_pair.second) << endl;
    
    return 0;
}

実行結果

最低点数 (min_element): 58
最高点数 (max_element): 100
--------------------
最低点数 (minmax_element): 58
最高点数 (minmax_element): 100

コードの解説

min_element / max_element

auto min_it = min_element(scores.begin(), scores.end());

  • 戻り値は「イテレータ」: これらの関数が返すのは、最小値や最大値そのものではなく、その要素を指し示すイテレータである、という点が非常に重要です。イテレータは、コンテナ内の要素の位置を示す、ポインタのようなものです。
  • *min_it: イテレータが指し示す先の実際の値を取得するには、アスタリスク * を使って間接参照(デリファレンス)する必要があります。

minmax_element

auto minmax_pair = minmax_element(scores.begin(), scores.end());

  • 戻り値は「ペア」: この関数は、最小要素を指すイテレータと、最大要素を指すイテレータのペア (std::pair) を返します。最小値と最大値の両方が必要な場合、min_elementmax_element を別々に呼び出すよりも、minmax_element を一度だけ呼び出す方が効率的です。
  • *(minmax_pair.first): ペアの1番目の要素(.first)に、最小要素を指すイテレータが格納されています。
  • *(minmax_pair.second): ペアの2番目の要素(.second)に、最大要素を指すイテレータが格納されています。

まとめ

今回は、C++の <algorithm> ライブラリが提供する、コンテナの最小値・最大値を取得するための関数を解説しました。

  • min_element, max_element: それぞれ最小/最大の要素を指すイテレータを返す。
  • minmax_element: 最小/最大の要素を指すイテレータのペアを、より効率的に返す。
  • 実際の値を取得するには、返されたイテレータをアスタリスク *間接参照する。

自前でループを書くよりも、これらの標準アルゴリズム関数を使った方が、コードが簡潔で意図が明確になり、多くの場合でより効率的に動作します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次