最近c++を勉強し始めて、最小値・最大値の取得方法につまづいたので備忘録として残します。
vector型、array型および配列の3種類を調べました。
また、調べた関数はmin_element
関数,max_element
関数およびminmax_element
関数です。この3つの関数はc++の標準ライブラリに用意されています。
結論
最小値・最大値を別々に知りたい場合
// xはvector or array or 配列
int min = *min_element(begin(x), end(x));
int max = *max_element(begin(x), end(x));
最小値・最大値両方得たい場合
// vector の場合(vecはvector型配列)
pair<vector<int>::iterator, vector<int>::iterator> minmax;
minmax = minmax_element(begin(vec), end(vec));
// xが array or 配列 の場合
pair<int*, int*> minmax;
minmax = minmax_element(begin(x), end(x));
テスト
{10,30,20,50,40}という数字列を使って動作テストをしました。
vector型の場合
minmax_element関数を使うときにpair
クラスに格納されるのはイテレータであることに注意が必要です。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
vector<int> vec;
vec = {10,30,20,50,40};
// 最小・最大値
int min = *min_element(begin(vec), end(vec));
int max = *max_element(begin(vec), end(vec));
cout << min << " , " << max << endl;
// minmax関数 (イテレータがpairに格納されたものが返される)
pair<vector<int>::iterator, vector<int>::iterator> minmax;
minmax = minmax_element(begin(vec), end(vec));
// pairの最初の要素が最小値のイテレータ, 2番目の要素がmaxのイテレータ
cout << *minmax.first << " , " << *minmax.second << endl;
return 0;
}
#出力結果
10 , 50
10 , 50
array型の場合
#include<iostream>
#include<algorithm>
#include<array>
using namespace std;
int main(){
array<int, 5> arr;
arr = {10,30,20,50,40};
// 最大・最小を別々に取得したい場合
int min = *min_element(begin(arr), end(arr));
int max = *max_element(begin(arr), end(arr));
cout << min << " , " << max << endl;
// minmax関数 (最小・最大値のポインタがpairに格納される)
pair<int*, int*> minmax;
minmax = minmax_element(begin(arr), end(arr));
//値を取り出す際は*演算子を使う
cout << *minmax.first << " , " << *minmax.second << endl;
return 0;
}
#出力結果
10 , 50
10 , 50
配列の場合
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int x[5] = {10,30,20,50,40};; //要素数5の配列を定義
// 最大・最小を別々に取得したい場合
int min = *min_element(begin(x), end(x));
int max = *max_element(begin(x), end(x));
cout << min << " , " << max << endl;
// minmax関数, 最小値と最大値のポインタを返すので、int*と定義
pair<int*, int*> minmax;
minmax = minmax_element(begin(x), end(x));
//値を取り出す際は*演算子を使う
cout << *minmax.first << " , " << *minmax.second << endl;
return 0;
}
#出力結果
10 , 50
10 , 50
備考
https://cpprefjp.github.io/reference/algorithm/minmax.html
https://qiita.com/shirakawa4756/items/f4cc65c6b2b412b10c0c
不備などがありましたら、教えていただけると幸いです。
追記(2021/8/6)
@myoukaku さんに以下のようなauto
を使った書き方を教えていただきました。ありがとうございます。
例えば、vector型を使うとき、2行を一行にすることができます。
例えば、vector型を使う時の記述を簡単にできます。
//autoを使う前
pair<vector<int>::iterator, vector<int>::iterator> minmax;
minmax = minmax_element(begin(vec), end(vec));
//autoを使った場合
auto minmax = minmax_element(begin(vex), end(vec));
また、この書き方であればvector型だけでなく、array型や配列でも同じ書き方で済みます。