min() 的简洁实现 returns 多个值中的最小值
Succinct implementation of min() that returns minimum of multiple values
有了std::min()
,我们就可以std::min(a, b)
。但是,如果我想要 min(a, b, c)
或 min(a, b, c, d, e)
怎么办?我知道以下实现有效:
template <typename T>
const T& min(const T& x, const T& y) {
return x < y ? x : y;
}
template <typename T, typename... Ts>
const T& min(const T& x, const T& y, const Ts&... xs) {
return min(min(x, y), xs...);
}
但我想要一个简洁的函数(当然,前提是它完全可能)。我试过以下方法
using std::swap;
template <typename T, typename... Ts>
const T& min(const T& x, const T& y, const Ts&... xs) {
return min(min(x, y), xs...);
}
这不适用于 min(1, 2, 3)
。如果我可以只导入 std::swap()
的特定重载,这个问题就可以解决,不幸的是,这在当前的 C++ 中似乎是不可能的。所以,我想问,是否有一个简洁的实现仅通过一个函数就可以实现我想要的?请注意,我正在考虑 C++14。请不要使用 C++1z。
我会咬:
#include <initializer_list>
#include <algorithm>
#include <functional>
template<template<typename> class CompT = std::less, typename T, typename... Ts>
T const& variadic_min(T const& a, T const& b, Ts const&... ts) {
return std::min({ std::cref(a), std::cref(b), std::cref(ts)... }, CompT<T>{});
}
还可以添加适当的 static_assert
以在并非所有类型都相同的情况下改进错误消息。
您可以使用 std::min_element
:
auto lst = {4, 3, 1, 2, 5};
auto iter = std::min_element(std::begin(lst), std::end(lst));
std::cout << *iter << '\n'; // 1
有了std::min()
,我们就可以std::min(a, b)
。但是,如果我想要 min(a, b, c)
或 min(a, b, c, d, e)
怎么办?我知道以下实现有效:
template <typename T>
const T& min(const T& x, const T& y) {
return x < y ? x : y;
}
template <typename T, typename... Ts>
const T& min(const T& x, const T& y, const Ts&... xs) {
return min(min(x, y), xs...);
}
但我想要一个简洁的函数(当然,前提是它完全可能)。我试过以下方法
using std::swap;
template <typename T, typename... Ts>
const T& min(const T& x, const T& y, const Ts&... xs) {
return min(min(x, y), xs...);
}
这不适用于 min(1, 2, 3)
。如果我可以只导入 std::swap()
的特定重载,这个问题就可以解决,不幸的是,这在当前的 C++ 中似乎是不可能的。所以,我想问,是否有一个简洁的实现仅通过一个函数就可以实现我想要的?请注意,我正在考虑 C++14。请不要使用 C++1z。
我会咬:
#include <initializer_list>
#include <algorithm>
#include <functional>
template<template<typename> class CompT = std::less, typename T, typename... Ts>
T const& variadic_min(T const& a, T const& b, Ts const&... ts) {
return std::min({ std::cref(a), std::cref(b), std::cref(ts)... }, CompT<T>{});
}
还可以添加适当的 static_assert
以在并非所有类型都相同的情况下改进错误消息。
您可以使用 std::min_element
:
auto lst = {4, 3, 1, 2, 5};
auto iter = std::min_element(std::begin(lst), std::end(lst));
std::cout << *iter << '\n'; // 1