Они более или менее эквивалентны, за исключением того, что lower_bound
будет использовать operator<
для поиска элементов, если предикат не указан. * partition_point
является более общим в том смысле, что он позволяет разделить диапазон в соответствии с некоторым общим предикат, а не какой-то предикат против value
.
Обратите внимание, что lower_bound
значительно предшествует существованию более общих концепций разбиения в C ++.
*, и в значительной степени подразумевается, что предикат, используемый в lower_bound
, должен удовлетворять соотношению меньше чем, хотя и не требуется
Из [alg.partitions]
template<class ForwardIterator, class Predicate>
ForwardIterator partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
Требуется : ForwardIterator’s
тип значения должен быть преобразован в Predicate’s
тип аргумента. [first, last)
должен быть разделен на pred
, то есть все элементы, которые удовлетворяют pred
, должны появляться перед теми, которые соответствуют
нет.
Возвращает : середина итератора такая, что all_of(first, mid, pred)
и none_of(mid, last, pred)
оба верны.
Сложность : O(log(last - first))
приложения pred
.
А из [lower.bound]
template<class ForwardIterator, class T>
ForwardIterator
lower_bound(ForwardIterator first, ForwardIterator last,
const T& value);
template<class ForwardIterator, class T, class Compare>
ForwardIterator
lower_bound(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp);
Требуется : элементы e
из [first, last)
должны быть разделены относительно выражения e < value
или comp(e, value)
.
Возвращает : самый дальний итератор i
в диапазоне [first, last]
такой, что для каждого итератора j
в
диапазон [first, i)
выполняются следующие соответствующие условия: *j < value
или comp(*j, value) != false
.
Сложность : Максимум log2(last - first) + O(1)
сравнения.