Cスタイルの配列や std::vector
、 std::array
の要素の中で最大値を探すか、最小値を見つける方法を紹介します。
1. 繰り返し文で最小、最大値を探す
最も簡単な方法は、for反復文で要素のすべての値を巡回しながら最小値、最大値を見つけることです。
#include <iostream>
#include <climits>
int main() {
int arr[] = { 11, 42, -5, 9, -8, 34, 0 };
int min = INT_MAX;
int max = INT_MIN;
for (int i: arr)
{
if (i < min) {
min = i;
}
if (i > max) {
max = i;
}
}
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
Output:
min: -8
max: 42
2. std::max_element() で最小、最大値を探す
min_element(begin, end)
と max_element(begin, end)
関数は、引数として渡された配列の begin から end までの要素の中で最小、最大値を探します。
関数は最大値と最小値に対応するオブジェクトアドレスを返すため、 *
を使用して値を読み取る必要があります。
2.1 Cスタイルの配列
Cスタイル配列の場合、beginは配列の開始アドレス、endは配列の開始アドレスに配列サイズを加えると配列の終了アドレスになります。このように最大値、最小値を見つけることができます。 配列のサイズはsizeofを使用して計算できます。
#include <iostream>
#include <algorithm>
int main() {
int arr[] = { 11, 42, -5, 9, -8, 34, 0 };
int size = sizeof(arr) / sizeof(*arr);
int min = *std::min_element(arr, arr + size);
int max = *std::max_element(arr, arr + size);
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
Output:
min: -8
max: 42
上記の例では、配列の最後の要素のアドレス値を計算するときにsizeofを使用しましたが、 std::begin(arr)
と std::end(arr)
を使用すると、あえて配列サイズを直接計算する必要はありません。
以下のコードの実行結果は上記と同じです。
#include <iostream>
#include <algorithm>
int main() {
int arr[] = { 11, 42, -5, 9, -8, 34, 0 };
int min = *std::min_element(std::begin(arr), std::end(arr));
int max = *std::max_element(std::begin(arr), std::end(arr));
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
2.2 std::vector
vector の場合も min_element(), max_element() の使用方法は同じです。代わりに vector は begin()
と end()
関数を提供するので、アドレス値を別々に計算する必要はありません。
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> arr = { 11, 42, -5, 9, -8, 34, 0 };
int min = *std::min_element(arr.begin(), arr.end());
int max = *std::max_element(arr.begin(), arr.end());
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
Output:
min: -8
max: 42
2.3 std::array
std::array
の場合も使用方法は vector と同じです。
#include <iostream>
#include <algorithm>
#include <array>
int main() {
std::array<int, 7> arr = { 11, 42, -5, 9, -8, 34, 0 };
int min = *std::min_element(arr.begin(), arr.end());
int max = *std::max_element(arr.begin(), arr.end());
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
Output:
min: -8
max: 42
3. std::minmax_element() で最小、最大値を探す
std::minmax_element(begin, end)
は begin から end までの要素の中で最小値、最大値を探し、結果を std::pair
として返します。
返される値は見つかったオブジェクトのアドレス値であるため、 *
でvalueを読み取る必要があります。
3.1 Cスタイルの配列
以下のように最小値、最大値を見つけることができます。返されるペアのfirstが最小値、secondが最大値になります。
#include <iostream>
#include <algorithm>
int main() {
int arr[] = { 11, 42, -5, 9, -8, 34, 0 };
int size = sizeof(arr) / sizeof(*arr);
std::pair<int*, int*> minmax = std::minmax_element(std::begin(arr), std::end(arr));
std::cout << "min: " << *(minmax.first) << std::endl;
std::cout << "max: " << *(minmax.second) << std::endl;
return 0;
}
Output:
min: -8
max: 42
3.2 std::vector
vectorも配列と同じ方法で最大値、最小値を取得できます。
vector の場合、返される std::pair<>
の型が非常に長いが、ただ auto で結果を受け取ることができます。
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> arr = { 11, 42, -5, 9, -8, 34, 0 };
auto minmax = std::minmax_element(arr.begin(), arr.end());
// std::pair<std::vector<int>::iterator, std::vector<int>::iterator> minmax =
// std::minmax_element(arr.begin(), arr.end());
std::cout << "min: " << *(minmax.first) << std::endl;
std::cout << "max: " << *(minmax.second) << std::endl;
return 0;
}
Output:
min: -8
max: 42
3.3 std::array
std::array
の場合も使用方法は vector と同じです。
#include <iostream>
#include <algorithm>
#include <array>
int main() {
std::array<int, 7> arr = { 11, 42, -5, 9, -8, 34, 0 };
auto minmax = std::minmax_element(arr.begin(), arr.end());
std::cout << "min: " << *(minmax.first) << std::endl;
std::cout << "max: " << *(minmax.second) << std::endl;
return 0;
}
Output:
min: -8
max: 42