Может быть, этот вопрос немного теоретический, но мне интересно, каковы дизайнерские стимулы позади определения std::minmax
как это
template <class T>
pair<T,T> minmax (initializer_list<T> il);
Что означает, IMO, переданный объект, li
будет скопированный и каждый из его членов также должен быть копируемым.
В то время как, std::min_element
(или по этому вопросу std::max_element
) является более «эффективным» в том смысле, что передаются только итераторы контейнера (нет необходимости фактически копировать весь контейнер)
template <class ForwardIterator>
ForwardIterator min_element (ForwardIterator first, ForwardIterator last);
РЕДАКТИРОВАТЬ — на основе комментария Йоахима Пилеборга, initializer_list<T>
объекты не копируются, поэтому я уточняю свой вопрос — почему std::minmax
ограничивается такими объектами, а не произвольными контейнерами (которые имеют, так сказать, неконстантную природу)
Для вашего обновленного вопроса: minmax
также может работать с общим случаем пары итераторов, это называется minmax_element
, Так minmax
Сам по себе это просто сокращение удобства, чтобы иметь возможность писать такие компактные вещи, как это:
// define a, b, c here
int min, max;
std::tie(min, max) = std::minmax({a, b, c});
…вместо того, чтобы писать это:
// define a, b, c here
int min, max;
auto list = {a, b, c};
auto result = std::minmax_element(list.begin(), list.end());
min = *result.first;
max = *result.second;