[C++] vectorから最小値(最大値)を取得 [min_element, max_element]

[C++] vectorから最小値(最大値)を取得 [min_element, max_element]

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() で検索した結果など、イテレータであればインデックスが求められます。

参考URL

C++カテゴリの最新記事