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)