2014-12-16 4 views
0

Может быть, этот вопрос немного Теоретико, но мне интересно, каковы конструктивные стимулы за определение std::minmax как этотстанд :: MINMAX initializer_list <T> аргумент

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); 

EDIT - на основе Комментарий Joachim Pileborg, initializer_list<T> Объекты не копируются, поэтому я точно задаю свой вопрос: почему std::minmax ограничен такими объектами, а не произвольными контейнерами (которые, так сказать, имеют «неконстантный» характер)

+3

Из [эта ссылка] (Http: // ан .cppreference.com/w/cpp/utility/initializer_list): «Копирование' std :: initializer_list' не копирует базовые объекты ». –

+0

@Joachim Pileborg Thx за ценный комментарий, я отредактировал мой вопрос –

ответ

5

Для ваш обновленный вопрос: 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;