返回最小值的 min() 的简洁实现

Succinct implementation of min() that returns minimum of multiple values

本文关键字:简洁 实现 min 最小值 返回      更新时间:2023-10-16

有了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