Привет.
Есть задача поиска минимального элемента в контейнере. std::min_element подходит в большинстве случаев, но не всегда является оптимальным решением.
Например, когда значения элементов ограничены снизу (типичный случай -- вектор беззнаковых целых).
В этом случае, даже если это гарантированно минимальное значение встретится, min_element все равно пройдет по всему контейнеру.
Другой пример: нужно найти "почти минимальный элемент": т.е. стараемся найти минимальный, но если уж нашли какой-нибудь меньше определенного значения, то он вполне подойдет.
Вот мой велосипед для этих целей:
template <class ForwardIterator, class T>
inline
ForwardIterator
min_element_bounded(ForwardIterator first,
ForwardIterator last,
T const& v)
{
if (first == last)
return last;
ForwardIterator lowest = first;
if (!(v < *lowest))
return lowest;
while (++first != last) {
if (*first < *lowest) {
lowest = first;
if (!(v < *lowest))
return lowest;
}
}
return lowest;
}
Т.е. это std::min_element плюс условие для раннего return. Соответственно, есть max_element_bounded() и версии с компаратором.
Хотелось бы услышать критику этого решения, начиная с "это противоречит философии STL", продолжая "это уже есть в бусте" и заканчивая любым конструктивом в смысле именования и реализации.