为什么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::vector
或std::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
已经涵盖了这种情况。
我们可以通过以下方式使用std::min
:
// 1.
int a = 1, b = 2;
std::min(a, b);
// 2.
std::min({1,2,3,4});
但为什么不能使用std::vector
或std::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
已经涵盖了这种情况。