C++で配列の最大値を求める方法として、まず覚えておきたいのは、配列の要素を先頭から順番に見ていき、今まででいちばん大きい値を記録し続けるという考え方です。
たとえば、配列の中に複数の数値が入っているとします。
その中で最大値を探したい場合は、最初の要素をいったん「現在の最大値」としておき、2番目以降の要素と順番に比べていきます。
もし、今見ている要素のほうが大きければ、最大値をその値に更新します。
これを最後まで繰り返すと、最終的に配列全体の最大値が求まります。
この方法は、最大値を探す最も基本的な考え方です。
C++に限らず、さまざまなプログラミング問題で使える重要な発想でもあります。
最大値を求める基本的な考え方
最大値を探すときに大切なのは、最初の要素を基準にすることです。
最初から 0 を最大値候補にしてしまうと、配列の中身がすべて負の数だったときに正しい答えが出ません。
そのため、通常は配列の先頭要素を仮の最大値として採用し、そこから後ろの要素と比較していきます。
たとえば、最初の値が 3 なら、最初の時点では 3 が最大値候補です。
次に 8 を見て、8 のほうが大きければ最大値を 8 に更新します。
その後 2 を見て、2 は 8 より小さいので更新しません。
さらに 10 を見て、10 のほうが大きければ最大値を 10 に更新します。
最後まで見終わった時点で残っている値が最大値です。
この流れを理解しておくと、単に配列の最大値を求めるだけでなく、最小値を探したり、条件を満たす中で最大のものを選んだりする処理にも応用できます。
標準ライブラリを使う方法
C++には、最大値を探すための便利な標準機能も用意されています。
これを使うと、自分で比較処理を細かく書かなくても、指定した範囲の中から最大の要素を見つけられます。
ただし、この機能が返すのは「最大値そのもの」ではなく、最大の要素がどこにあるかを示す情報です。
配列に対して使う場合は、その位置情報から実際の値を取り出す、という考え方になります。
この方法はコードを短く書けるという利点がありますが、学習の最初の段階では、まず自分で順番に比較していく基本の考え方を理解しておくほうが重要です。
配列の要素数について
配列の最大値を求めるには、配列の中に要素がいくつ入っているかを把握する必要があります。
配列の先頭から最後まで順番に見ていくためです。
C++では、配列全体の大きさと1要素分の大きさから要素数を求める書き方がよく使われます。
これは、その場所に実際の配列変数そのものがある場合には有効です。
ただし、この考え方には注意点があります。
関数の引数として配列を受け取った場合、見た目は配列でも、実際には配列そのものではなく、先頭要素を指す情報として扱われることがあります。
そのため、配列の要素数を求める方法は、どこでも同じように使えるわけではありません。
この点は初心者がつまずきやすいところなので、配列そのものと、配列が別の形で扱われる場合の違いを少しずつ意識していくことが大切です。
最大値の位置も知りたい場合
最大値を求めるだけでなく、その値が配列の何番目にあるかを知りたいこともあります。
この「何番目か」を表す番号を、添字やインデックスと呼びます。
最大値を探すときに、値だけでなく「その値が見つかった位置」もいっしょに記録しておけば、最大値の位置も同時に求められます。
たとえば、今までで最も大きい値を更新したときに、その位置もあわせて保存しておくイメージです。
標準ライブラリの機能を使う場合も、返ってくるのは最大要素の場所を示す情報なので、そこから「先頭から数えて何番目か」を求めることができます。
入力された値の中から最大値を求める場合
学習の中では、あらかじめ決まった配列ではなく、ユーザーが入力した複数の数値の中から最大値を求める問題もよく出てきます。
この場合も考え方は同じです。
まず何個の値を扱うかを決め、その数だけ値を読み込み、先頭の値を最大値候補にして後ろの値を順番に比較していきます。
最後まで比較し終えれば最大値がわかります。
ただし、固定の大きさの配列を使う場合は、あらかじめ決めた上限を超える数を入力しないように注意が必要です。
たとえば100個までしか入らない配列なのに、それ以上の個数を扱おうとすると、配列の範囲外にアクセスしてしまい、正しく動かなくなるおそれがあります。
そのため、入力によって要素数が変わる場合は、固定長の配列よりも、必要な数だけ要素を持てる仕組みを使うほうが安全です。
空の配列には注意が必要
最大値を求めるときには、配列の先頭要素を最初の基準にすることが多いですが、これは配列に少なくとも1つは要素が入っていることが前提です。
もし要素が1つも入っていない空の配列で先頭要素を使おうとすると、存在しない場所を読もうとしてしまいます。
これは正しくありません。
標準ライブラリを使う場合も、空の範囲に対して最大値探索を行うと、そのまま値を取り出してはいけない結果が返ってくることがあります。
そのため、空の配列や要素数が0の場合は、事前にその状態を確認しておく必要があります。
負の数だけの配列でも正しく求められる理由
最大値探索では、最初の要素をそのまま基準にするため、配列の中身がすべて負の数であっても問題なく処理できます。
たとえば、負の数しか入っていない場合でも、その中で最も大きい値は必ず存在します。
最初の要素を基準にして順番に比較していけば、自然に正しい最大値が残ります。
一方で、最初から 0 を基準にしてしまうと、すべての要素が 0 より小さい場合に正しい最大値を見つけられません。
このため、最大値探索では「最初の要素を使う」という基本がとても重要です。
配列と可変長コンテナの違い
C++では、昔ながらの配列だけでなく、要素数を柔軟に扱える仕組みもよく使われます。
実際の開発では、入力によって要素数が変わるなら、固定長の配列よりも柔軟な方法が選ばれることが多いです。
ただし、最大値を求める考え方そのものは同じです。
先頭の要素を最大値候補にし、後ろの要素を順番に見て、より大きい値があれば更新する。
この流れは配列でも他のデータ構造でも共通しています。
つまり、最初に身につけるべきなのは「最大値を更新しながら走査する」という考え方そのものです。
それを理解しておけば、扱うデータ構造が変わっても応用できます。
学習の上でのおすすめ
C++で配列の最大値を求める学習をするときは、まずは自分で1つずつ比較して最大値を更新する方法をしっかり理解するのがおすすめです。
この方法は、アルゴリズムの基本をそのまま体験できるからです。
そのうえで、慣れてきたら標準ライブラリの機能を覚えるとよいです。
標準ライブラリを使う方法は、短く書けて読みやすくなるという利点があります。
ただし、内部で何をしているのかを理解せずに使うと応用が利きにくいため、まずは基本原理から入るほうが確実です。
まとめ
C++で配列の最大値を求めるときの基本は、先頭要素を仮の最大値として、後ろの要素を順番に比較しながら更新していくことです。
これが最も大切な考え方です。
また、C++には最大値を探すための標準機能もありますが、それは最大要素の位置を示す情報を返す仕組みであり、使うときには範囲の指定や空配列への注意が必要です。
さらに、学習を進めるうえでは次の点を押さえておくと理解が深まります。
- 最大値探索では最初の要素を基準にするのが基本であること
- 0 を最初の基準にすると、負の数だけの配列で誤ることがあること
- 配列の要素数の扱いには注意が必要なこと
- 空の配列ではそのまま最大値を求められないこと
- 入力によって要素数が変わる場合は、固定長配列より柔軟な方法が適していること
最大値を求める考え方は、プログラミングの基礎としてとても重要です。
ここをしっかり理解すると、最小値の探索、条件付きの最大値、順位づけの処理などにも自然につなげられます。
以上、C++の配列の最大値の求め方についてでした。
最後までお読みいただき、ありがとうございました。
