Я всегда предполагал, что std::lower_bound()
работает в логарифмическом времени, если я передаю ему пару итераторов красно-черного дерева (set::iterator
или map::iterator
). Мне пришлось сжечь себя дважды, заметив, что std::lower_bound()
работает в O (n) времени в этом случае, по крайней мере, с реализацией libstdС++. Я понимаю, что в стандарте нет понятия итераторов с красно-черным деревом; std::lower_bound()
будет рассматривать их как двунаправленные итераторы и advance
их в линейном времени. Я до сих пор не вижу причин, по которым реализация не смогла создать тег итератора с конкретным реализацией для итераторов красно-черного дерева и вызвать специализированный lower_bound()
, если переданные в итераторах красно- итераторы черного дерева.
Есть ли какая-либо техническая причина, по которой std::lower_bound()
не специализируется на итераторах красно-черного дерева?
ОБНОВЛЕНИЕ: Да, Я знаю функции-члены поиска, но это не так. (В шаблоном коде у меня может не быть доступа к контейнеру или работать только на части контейнера.)
После того, как щедрость истекло: Я нахожу, что Мехрдад и Якк отвечают самым убедительным. Я тоже не мог решить между ними; Я даю щедрость Мехрдаду и принимаю ответ Якка.