C++ で vector から最小値(最大値)を求める方法
vector
に格納された複数の要素の中から最小値(最大値)を取得したい場合、std::min_element
(max_element
)を使用します。
std::min_element
(max_element
)はイテレータ範囲 [first, last)
から最小または最大の要素を指す最初のイテレータを取得します。
std::vector<int> vec = { 3, 1, 4, 1, 5, 9, 2, 6, 5 };
// 先頭から末尾までの範囲で最小値を指すイテレータを取得
auto it = std::min_element(vec.begin(), vec.end());
// min: 1
std::cout << "min: " << *it << std::endl;
比較関数を指定する方法
大小関係を比較する方法を指定することもできます。
以下のコードは3で割った余りが最も大きな要素を求めるコードです。
ラムダ式で要素を受け取り比較結果を返します。
std::vector<int> vec = { 3, 1, 4, 1, 5, 9, 2, 6, 5 };
// 3で割った余りが最も大きな値を指すイテレータを取得
auto it = std::max_element(vec.begin(), vec.end(), [](const int& a, const int& b) {
return a % 3 < b % 3;
});
// 5
std::cout << *it << std::endl;
最小値(最大値)の要素が格納されたインデックスを取得する方法
最小値(最大値)だけでなく、その値が格納されたインデックスが欲しい場合があります。その場合は、イテレータ間の距離を求める std::distance()
を使用することで実現できます。
std::vector<int> vec = { 3, 1, 4, 1, 5, 9, 2, 6, 5 };
// 先頭から末尾までの範囲で最大値を指すイテレータを取得
auto it = std::max_element(vec.begin(), vec.end());
// 取得したイテレータが先頭から何番目の要素か(インデックス)を求める
int index = std::distance(vec.begin(), it);
// value: 9
// index: 5
std::cout << "value: " << *it << std::endl;
std::cout << "index: " << index << std::endl;
求めているのは先頭を指すイテレータからの距離なので、std::find()
や std::find_if()
で検索した結果など、イテレータであればインデックスが求められます。
コメントを書く