Я узнал, что функция set.lower_bound (key) возвращает значение из набора как можно ближе к клавише
Прежде всего, это ложь. Всегда лучше обратиться к cppreference для получения правильной информации. Вот что нужно сказать о std :: set :: lower_bound:
Возвращает итератор, указывающий на первый элемент, ключ которого не меньше (то есть больше или равен).
Следовательно, это не элемент как можно ближе , а первый элемент, больший или равный.
Мне было интересно, как он работает, когда передаваемый ключ является парой (скажем, x, y координаты точки), т.е. набор содержит пары.
Как это будет работать для любого другого типа T
. Внутренне он реализован как BST (обычно в виде красно-черного дерева). Следовательно, поиск O(nlogn)
. Какой порядок / компаратор использовал ты говоришь? std :: set в основном:
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class set;
Как видите, он принимает компаратор в качестве параметра шаблона со значением по умолчанию std :: less . Следовательно, он
проверяет, меньше ли первый аргумент, чем второй
Вы спрашиваете, как он сравнивает две пары? Вот что говорит c на std :: pair :
Сравнивает lhs и rhs лексикографически по оператору <, то есть сравнивает первые элементы и только если они эквивалентны, сравнивает вторые элементы. </p>
Итак, теперь вы понимаете, как работает std :: lower_bound. Обход базового bst позволяет найти первый элемент, равный или превышающий ключ, учитывая дерево, упорядоченное в соответствии с компаратором.
Надеюсь, теперь все предельно ясно:)