#include template Iterator FindImpl(const T &value, Iterator first, Iterator last, std::random_access_iterator_tag) { auto if_no = last; last--; while (first < last) { Iterator mid = (last - first) / 2 + first; if (*mid < value) { first = mid + 1; } else { last = mid; } } if (*first == value) { return first; } return if_no; } template Iterator FindImpl(const T &value, Iterator first, Iterator last, std::bidirectional_iterator_tag) { while (first != last) { if (*first == value) { return first; } first++; } return last; } template Iterator Find(const T &value, Iterator first, Iterator last) { return FindImpl(value, first, last, typename std::iterator_traits::iterator_category()); }