- algorithm[meta header]
- std[meta namespace]
- function template[meta id-type]
namespace std {
template <class T>
const T& min(const T& a, const T& b); // (1)
template <class T>
constexpr const T& min(const T& a, const T& b); // (1) C++14
template <class T, class Compare>
const T& min(const T& a, const T& b, Compare comp); // (2)
template <class T, class Compare>
constexpr const T& min(const T& a, const T& b, Compare comp); // (2) C++14
template <class T>
T min(initializer_list<T> t); // (3) C++11
template <class T>
constexpr T min(initializer_list<T> t); // (3) C++14
template <class T, class Compare>
T min(initializer_list<T> t, Compare comp); // (4) C++11
template <class T, class Compare>
constexpr T min(initializer_list<T> t, Compare comp); // (4) C++14
}
- initializer_list[link /reference/initializer_list/initializer_list.md]
同じ型の2つの値、もしくはinitializer_list
によるN個の値のうち、最小値を取得する。
最後の引数comp
は、2項の述語関数オブジェクトであり、これを使用して比較演算をカスタマイズすることができる。
- 型
T
がoperator<
による比較が可能であること。 initializer_list
バージョンはそれに加えて、要素数が1以上であり、T
がコピーコンストラクト可能であること。
最小値
- 等価な要素が 2 つ以上あった場合には、最も左の要素を返す。
- 型
T
がoperator<
による比較が可能であることが要件になっているが、(2) と (4) の形式では当該要件を満たさなくても問題ないものと思われる。
#include <cassert>
#include <algorithm>
#include <functional>
int main()
{
int result1 = std::min(2, 3);
assert(result1 == 2);
int result2 = std::min(2, 3, std::greater<int>());
assert(result2 == 3);
int result3 = std::min({1, 2, 3});
assert(result3 == 1);
int result4 = std::min({1, 2, 3}, std::greater<int>());
assert(result4 == 3);
}
- std::min[color ff0000]
- std::greater[link /reference/functional/greater.md]
template <class T>
const T& min(const T& a, const T& b)
{
return b < a ? b : a;
}
template <class T, class Compare>
const T& min(const T& a, const T& b, Compare comp)
{
return comp(b, a) ? b : a;
}
template <class T>
T min(std::initializer_list<T> t)
{
return *std::min_element(t.begin(), t.end());
}
template <class T, class Compare>
T min(std::initializer_list<T> t, Compare comp)
{
return *std::min_element(t.begin(), t.end(), comp);
}
- std::min_element[link min_element.md]
- t.begin()[link /reference/initializer_list/initializer_list/begin.md]
- t.end()[link /reference/initializer_list/initializer_list/end.md]
- Clang: ??
- GCC: 4.7.0(initializer_listバージョンが使用可能)
- ICC: ??
- Visual C++: 2013, 2015
Windows環境においては、<windows.h>
をインクルードするとmin
という名前の関数マクロが定義され、std::min()
と衝突してしまうという問題がある。
この解決策として以下の2つの方法がある:
<windows.h>
をインクルードするまでに#define NOMINMAX
を行う。これでmin
マクロがdefineされなくなる。std::min()
を呼び出す際に、(std::min)(a, b);
のように関数名をカッコで囲んで使用する。これで、名前解決においてstd::min()
関数が必ず使用される。