返回最小值的 min() 的简洁实现
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
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 返回最小值的 min() 的简洁实现