If you have multiple elements in the range [first, last) whose value equals the value val you are searching for, then the range [l, u) where
l = std::lower_bound(first, last, val)
u = std::upper_bound(first, last, val)
is precisely the range of elements equal to val within the range [first, last). So l and u are the “lower bound” and “upper bound” for the equal range. It makes sense if you’re accustomed to thinking in terms of half-open intervals.
(Note that std::equal_range will return both the lower and upper bound in a pair, in a single call.)