为什么std::min只支持initializer_list?

Why does std::min only support initializer_list?

我们可以通过以下方式使用std::min

// 1.
int a = 1, b = 2;
std::min(a, b);

// 2.
std::min({1,2,3,4});

但为什么不能使用std::vectorstd::list,因为模板中的参数是initializer_list

template <class T, class Compare>
  pair<T,T> minmax (initializer_list<T> il, Compare comp);

这样设计的原因是什么?

But why can't use a std::vector or std::list, Because the param in the template is initializer_list.

因为没有接受向量或列表的重载。这些不是初始化列表。

从 C++20 开始,您可以使用 std::ranges::min,您可以将这些容器或任何范围传递到其中。在此之前,有 std::min_element 可与任何一对迭代器一起使用。

要解释“为什么它不接受容器”,请考虑语义:

std::min({ "foo", "bar", "hello" })

std::min()的语义意思是“在输入参数中找到最小值”。因此 std::min()/std::max() 接受两个参数,或者一个 initializer_list 作为“更多参数”。

std::min() 不提供“遍历容器”的能力,因为容器被视为“参数”。

求容器中的最小值,有std::min_element(),eerorika的建议std::ranges::min()在C++20应该更好

std::min_element()用法,可参考How can I get the max (or min) value in a vector?

"The more they overthink the plumbing, the easier it is to stop up the drain." – Commander Montgomery Scott

std::min的目的是return其参数中的较小者。简洁明了。与您自己的设计一样,函数(或函数模板)最好做好一件事,而不是把很多事情都做得不好。因此,std::min 不了解容器。它只知道如何获取两件事并进行比较。容器知识被授予 std::min_element。在这两个模板之间,涵盖了大多数用例。

一个未涵盖的案例是当这些元素不是(范围内)容器的元素时找到两个以上元素的最小值。这种情况可以用 daisy-chaining std::min 来处理,但这样做有点尴尬。对于 C++11,决定处理更多参数的好处超过使模板复杂化的成本,只要复杂性保持在最低限度。因此,选择了一个单一的、简单的机制来提供任意数量的参数,即 std::initializer_list。不需要允许任意容器,因为 std::min_element 已经涵盖了这种情况。