min_element в контейнере с известным наименьшем элементом
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 01.09.11 06:35
Оценка:
Привет.

Есть задача поиска минимального элемента в контейнере. 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", продолжая "это уже есть в бусте" и заканчивая любым конструктивом в смысле именования и реализации.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.