Is there a function in that uses binary search, like `lower_bound`

but that returns the *last* item *less-than-or-equal-to* according to a given predicate?

`lower_bound`

is defined to:

Finds the position of the

firstelement in an ordered range that has a valuegreater than or equivalent toa specified value, where the ordering criterion may be specified by a binary predicate.

and `upper_bound`

:

Finds the position of the

firstelement in an ordered range that has a value that isgreater thana specified value, where the ordering criterion may be specified by a binary predicate.

Specifically, I have a container of time ordered events and for a given time I want to find the last item that came before or at that point. Can I achieve this with some combination of upper/lower bound, reverse iterators and using `std::greater`

or `std::greater_equal`

?

EDIT:

A tweak was needed to user763305’s suggestion to cope with if you ask for a point before the start of the array:

```
iterator it=upper_bound(begin(), end(), val, LessThanFunction());
if (it!=begin()) {
it--; // not at end of array so rewind to previous item
} else {
it=end(); // no items before this point, so return end()
}
return it;
```

In a sorted container, the last element that is less than or equivalent to `x`

, is the element before the first element that is greater than `x`

.

Thus you can call `std::upper_bound`

, and decrement the returned iterator once.

(Before decrementing, you must of course check that it is not the begin iterator; if it is, then there are no elements that are less than or equivalent to `x`

.)

Here is a wrapper function around upper_bound which returns the largest number in a container or array which is less than or equal to a given value:

```
template <class ForwardIterator, class T>
ForwardIterator largest_less_than_or_equal_to ( ForwardIterator first,
ForwardIterator last,
const T& value)
{
ForwardIterator upperb = upper_bound(first, last, value);
// First element is >, so none are <=
if(upperb == first)
return NULL;
// All elements are <=, so return the largest.
if(upperb == last)
return --upperb;
return upperb - 1;
}
```

For a better explanation of what this is doing and how to use this function, check out:

C++ STL — Find last number less than or equal to a given element in an array or container