Description

Lower_bound is a version of binary search: it attempts to find the
element value in an ordered range [first, last)[1]. Specifically, it
returns the first position where value could be inserted without
violating the ordering. [2] The first version of lower_bound
uses operator< for comparison, and the second uses the
function objectcomp.

The first version of lower_bound returns the furthermost iterator
i in [first, last) such that, for every iterator j in [first, i),
*j < value.

The second version of lower_bound returns the furthermost iterator
i in [first, last) such that, for every iterator j in [first, i),
comp(*j, value) is true.

Definition

Defined in the standard header algorithm, and in the nonstandard
backward-compatibility header algo.h.

Preconditions

[first, last) is ordered in ascending order according to
operator<. That is, for every pair of iterators i and j
in [first, last) such that i precedes j,
*j < *i is false.

For the second version:

[first, last) is a valid range.

[first, last) is ordered in ascending order according to
the function objectcomp. That is, for every pair of iterators i and j
in [first, last) such that i precedes j,
comp(*j, *i) is false.

Complexity

The number of comparisons is logarithmic: at most log(last - first) +
1. If ForwardIterator is a Random Access Iterator then the
number of steps through the range is also logarithmic; otherwise,
the number of steps is proportional to last - first. [3]

Notes

[1]
Note that you may use an ordering that is a strict weak ordering
but not a total ordering; that is, there might be values x and y
such that x < y, x > y, and x == y are all false. (See the
LessThan Comparable requirements for a more complete discussion.)
Finding value in the range [first, last), then, doesn't mean
finding an element that is equal to value but rather one that is
equivalent tovalue: one that is neither greater than nor less
than value. If you're using a total ordering, however (if you're
using strcmp, for example, or if you're using ordinary arithmetic
comparison on integers), then you can ignore this technical
distinction: for a total ordering, equality and equivalence are
the same.

[2]
If an element that is equivalent to [1]value is already
present in the range [first, last), then the return value of
lower_bound will be an iterator that points to that element.