Как проверить, вернул ли std::max_element элемент?

#c

#c

Вопрос:

Я изучаю std::max_element . Я написал следующий код:

 auto e = std::max_element(
                    std::begin(rtspUrls), std::end(rtspUrls),
                    [](const RTSPUrl amp;p1, const RTSPUrl amp;p2) {
                        unsigned int area1 = p1.resolution().width() * p1.resolution().height();
                        unsigned int area2 = p2.resolution().width() * p2.resolution().height();
                        return area1 < area2;
                    }); 
  

но одна вещь, которую я не мог понять, — это то, как я уверен, что у меня есть элемент в e . Может быть, что набор rtspUrls пуст. Мой e имеет тип std::_Rb_tree_const_iterator<RTSPUrl> , для которого я не знаю, как проверить, указывает ли он на что-то.

Комментарии:

1. if(rtspUrls.empty()) ?

Ответ №1:

Из cplusplus.com:

Возвращаемое значение

Итератор для наибольшего значения в диапазоне или последнего, если диапазон пуст.

Итак, чтобы проверить, действительно ли он что-то вернул, вы сравниваете его с std::end(rtspUrls) . Если он равен, то это не так. Если он не равен этому, то он вернул что-то, и вы можете получить к нему доступ через разыменование, т. Е. *e .

 if (e == std::end(rtspUrls)) {
  // No return
} else {
  // Use *e to get the value
}
  

Ответ №2:

Если rtspUrls пусто, max_element возвращает второй переданный вами параметр (итератор для последнего элемента), т.е. std::end(rtspUrls)