# Difference between upper_bound and lower_bound in stl

A simple answer is and less confusing WAY to remember this is below

`std::lower_bound`

- returns iterator to first element in the given range which is `EQUAL_TO or Greater than`

val.

`std::upper_bound`

- returns iterator to first element in the given range which is `Greater than val`

.

```
value a a a b b b c c c
index 0 1 2 3 4 5 6 7 8
bound l u
```

Where `l`

represents the lower bound of `b`

, and `u`

represents the upper bound of `b`

.

So if there are range of values that are "equal" with respect to the comparison being used, `lower_bound`

gives you the first of this, `upper_bound`

gives you one-past-the-end of these. This is the normal pattern of STL ranges `[first, last)`

.