6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

c++のvector,array,配列での最大値・最小値取得法まとめ

Last updated at Posted at 2021-08-04

最近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型や配列でも同じ書き方で済みます。

6
1
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?