yohhoyの日記

技術的メモをしていきたい日記

minmaxアルゴリズム

C++11標準ライブラリに新しく追加されたアルゴリズムstd::minmax, std::minmax_elementについてメモ。

名前の通り、最小値/最大値を一括して求めるアルゴリズム。(以下、引数に Comparator を取るオーバーロードは省略)

// 25.4.7, minimum and maximum:
template<class T>
pair<const T&, const T&> minmax(const T& a, const T& b);  // 2要素版

template<class T>
pair<T, T> minmax(initializer_list<T> t);  // 初期化子リスト版

template<class ForwardIterator>
pair<ForwardIterator, ForwardIterator>
  minmax_element(ForwardIterator first, ForwardIterator last);  // イテレータ版

コンパイル時に固定数のN要素を対象とするなら初期化子リスト版minmaxが、コンテナ等を対象とするならminmax_elementが便利。

#include <algorithm>

double x = 2, y = 1, z = 0;
std::vector<double> v = {2, 1, 0, -1};

auto result1 = std::minmax(x, y);
// result1 == std::pair(1, 2)
auto result2 = std::minmax({x, y, z});
// result2 == std::pair(0, 2)
auto result3 = std::minmax_element(v.begin(), v.end());
// result3 == std::pair(&v[3] = -1, &v[0] = 2)

Boost.Algoritm でも同様の関数テンプレートが提供される。boost::minmaxの戻り値型は、std::pairではなくboost::tupleとなることに注意。

#include <boost/algorithm/minmax.hpp>
#include <boost/algorithm/minmax_element.hpp>

auto result4 = boost::minmax(x, y);
// result4 == boost::tuple(1, 2);
auto result5 = boost::minmax_element(v.begin(), v.end());
// result5 == std::pair(&v[3] = -1, &v[0] = 2)