C++ における STL の std::min_element アルゴリズム
- 
          
            C++ で std::min_elementアルゴリズムを使って範囲内の最小要素素を検索する
- 
          
            C++ で std::minmax_elementアルゴリズムを使用して、範囲内の最小要素と最大要素を検索する
 
この記事では、C++ で STL の std::min_element アルゴリズムを使用する方法について説明します。
C++ で std::min_element アルゴリズムを使って範囲内の最小要素素を検索する
    
STL アルゴリズムには、コンテナ範囲を操作できる一般的な最小/最大検索関数が含まれています。std::min_element は、指定された範囲内の最小の要素を取得するこれらの関数の 1つです。比較関数が明示的に指定されていない場合、要素は演算子< と比較されます。したがって、コンテナにユーザー定義オブジェクトが格納されている場合は、対応する演算子を定義する必要があります。
範囲は、LegacyForwardIterator の要件を満たす必要があります。std::min_element 関数は 2つのイテレータを受け入れ、範囲内の最小の要素にイテレータを返します。範囲に最小要素の複数のインスタンスが含まれている場合、アルゴリズムはイテレータを最初のインスタンスに返します。指定された範囲が空の場合、2 番目の引数イテレータが返されます。
次の例は、vector コンテナの std::min_element の簡単な使用法を示しています。最小の要素の数値位置が必要な場合は、std::distance 関数を使用して計算する必要があることに注意してください。
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
  vector<string> v1 = {"ztop", "htop", "mtop", "ktop", "ptop"};
  vector<int> v2 = {111, 43, 12, 41, 34, 54, 13};
  auto ret = std::min_element(v1.begin(), v1.end());
  cout << "min_element(v1): " << std::setw(4) << *ret
       << "  at position: " << std::distance(v1.begin(), ret) << endl;
  auto ret2 = std::min_element(v2.begin(), v2.end());
  cout << "min_element(v2): " << std::setw(4) << *ret2
       << "  at position: " << std::distance(v2.begin(), ret2) << endl;
  return EXIT_SUCCESS;
}
min_element(v1): htop  at position: 1
min_element(v2):   12  at position: 2
C++ で std::minmax_element アルゴリズムを使用して、範囲内の最小要素と最大要素を検索する
STL に含まれるもう 1つの強力なアルゴリズムは、std::minmax_element です。指定された範囲内の最小要素と最大要素の両方を取得します。std::minmax_element は、最小の要素を最初のメンバーとして格納する std::pair 値を返します。範囲内の最大値に適格な値が複数ある場合、このアルゴリズムは最後の要素を返すことに注意してください。これらのアルゴリズムには両方とも、カスタム比較関数を示す 3 番目のパラメーターを含めることができるオーバーロードがあることに注意してください。
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
  vector<string> v1 = {"ztop", "htop", "mtop", "ktop", "ptop"};
  vector<int> v2 = {111, 43, 12, 41, 34, 54, 13};
  auto ret3 = std::minmax_element(v1.begin(), v1.end());
  cout << "min (v1): " << std::setw(4) << *ret3.first
       << "| max (v1): " << std::setw(4) << *ret3.second << endl;
  auto ret4 = std::minmax_element(v2.begin(), v2.end());
  cout << "min (v2): " << std::setw(4) << *ret4.first
       << "| max (v2): " << std::setw(4) << *ret4.second << endl;
  return EXIT_SUCCESS;
}
出力:
min (v1): htop| max (v1): ztop
min (v2):   12| max (v2):  111
