C++標準ライブラリstd::min
, std::max
アルゴリズムの動作仕様についてメモ。
問題:C++ min/maxアルゴリズムを「正しく」実装せよ。
template <typename T> const T& min(const T& a, const T& b) { // どちらのmin実装が正しい? return a < b ? a : b; // #1 return b < a ? b : a; // #2 } template <typename T> const T& max(const T& a, const T& b) { // どちらのmax実装が正しい? return a < b ? b : a; // #3 return b < a ? a : b; // #4 }
答え:#2 と #3
2個の値を比較するmin/maxアルゴリズムでは、値が等価(equivalent)*1なときは1番目の値を返すと規定されている。実装#1や#4ではC++標準ライブラリの仕様違反となる。C++03 25.3.7/p2-3, p5-6より引用。
template<class T> const T& min(const T& a, const T& b); template<class T, class Compare> const T& min(const T& a, const T& b, Compare comp);2 Returns: The smaller value.
3 Remarks: Returns the first argument when the arguments are equivalent.template<class T> const T& max(const T& a, const T& b); template<class T, class Compare> const T& max(const T& a, const T& b, Compare comp);5 Returns: The larger value.
6 Remarks: Returns the first argument when the arguments are equivalent.
関連URL