具有单个参数的 std::min() 的实现是什么?
What is the implementation of std::min() that has a single parameter?
我在一段代码中看到如下语句:
std::min(0);
我能找到的最接近的定义是:
template <class T> constexpr T min (initializer_list<T> il);
到目前为止,我在 stl_algo.h
:
中找到了实现
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline _Tp
min(initializer_list<_Tp> __l)
{ return *std::min_element(__l.begin(), __l.end()); }
以前以为std::min()
只是计算两项中的最小值。任何人都可以向我解释它实际上做了什么吗?什么是 initializer_list
?
要回答标题中的问题,当一组数字包含一个数字时,一组数字中的最小值就是数字本身。这对我来说很容易理解。希望你也能明白。
I used to think that std::min() only calculates the minimum of two items.
它曾经是,但从 C++11 开始,它发生了变化。从 C++11 开始,有
template< class T >
T min( std::initializer_list<T> ilist );
和一些变体。它可以用作:
std::min({num1, num2, ..., numn});
我很惊讶
std::min(0);
适合你。它不应该。也许 g++ 支持它作为 non-standard 扩展。但是,您应该可以使用
std::min({0}); // That becomes an intializer_list<int> with one item.
符合标准。
min
和 initializer_list
的实际效果如何?
这个 min
函数变体将它的工作推迟到 std::min_element
, which finds minimum element in a range defined by a pair of iterators. std::initializer_list<T>
是一个轻量级代理对象,它提供对 const T
类型对象数组的访问,范围为 [begin(), end())
。
采用一个或多个参数的简单可变 min
函数:
#include <type_traits>
template <typename... Ts>
struct all_same {};
template <>
struct all_same<> {
constexpr static bool value = true;
};
template <typename T>
struct all_same<T> {
constexpr static bool value = true;
};
template <typename T, typename U, typename... Rest>
struct all_same<T, U, Rest...> {
constexpr static bool value = std::is_same_v<T, U> && all_same<U, Rest...>::value;
};
template <typename... Ts>
inline constexpr bool all_same_v = all_same<Ts...>::value;
template <typename T>
constexpr const T& min(const T& value) {
return value;
}
template <typename T, typename... U>
constexpr std::enable_if_t<all_same_v<T, U...>, const T&> min(const T& first,
const T& second,
const U&... rest) {
return first <= second ? min(first, rest...) : min(second, rest...);
}
// min(1); // equals to 1
// min(4, 3, 2, 1, 2, 3); // equals to 1
我在一段代码中看到如下语句:
std::min(0);
我能找到的最接近的定义是:
template <class T> constexpr T min (initializer_list<T> il);
到目前为止,我在 stl_algo.h
:
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline _Tp
min(initializer_list<_Tp> __l)
{ return *std::min_element(__l.begin(), __l.end()); }
以前以为std::min()
只是计算两项中的最小值。任何人都可以向我解释它实际上做了什么吗?什么是 initializer_list
?
要回答标题中的问题,当一组数字包含一个数字时,一组数字中的最小值就是数字本身。这对我来说很容易理解。希望你也能明白。
I used to think that std::min() only calculates the minimum of two items.
它曾经是,但从 C++11 开始,它发生了变化。从 C++11 开始,有
template< class T >
T min( std::initializer_list<T> ilist );
和一些变体。它可以用作:
std::min({num1, num2, ..., numn});
我很惊讶
std::min(0);
适合你。它不应该。也许 g++ 支持它作为 non-standard 扩展。但是,您应该可以使用
std::min({0}); // That becomes an intializer_list<int> with one item.
符合标准。
min
和 initializer_list
的实际效果如何?
这个 min
函数变体将它的工作推迟到 std::min_element
, which finds minimum element in a range defined by a pair of iterators. std::initializer_list<T>
是一个轻量级代理对象,它提供对 const T
类型对象数组的访问,范围为 [begin(), end())
。
采用一个或多个参数的简单可变 min
函数:
#include <type_traits>
template <typename... Ts>
struct all_same {};
template <>
struct all_same<> {
constexpr static bool value = true;
};
template <typename T>
struct all_same<T> {
constexpr static bool value = true;
};
template <typename T, typename U, typename... Rest>
struct all_same<T, U, Rest...> {
constexpr static bool value = std::is_same_v<T, U> && all_same<U, Rest...>::value;
};
template <typename... Ts>
inline constexpr bool all_same_v = all_same<Ts...>::value;
template <typename T>
constexpr const T& min(const T& value) {
return value;
}
template <typename T, typename... U>
constexpr std::enable_if_t<all_same_v<T, U...>, const T&> min(const T& first,
const T& second,
const U&... rest) {
return first <= second ? min(first, rest...) : min(second, rest...);
}
// min(1); // equals to 1
// min(4, 3, 2, 1, 2, 3); // equals to 1