upper_bound() returns an iterator to the elements in the given range which does not compare greater than the given value. The range given should be already sorted for upper_bound() to work properly. In other words it returns an iterator to the upper bound of the given element in the given sorted range and lower_bound() returns an iterator to the elements in the given range which does no compare less than the given value. The range given should be already sorted for lower_bound() to work properly. In other words it returns an iterator to the lower bound of the given element in the given sorted range.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main ()
{
int input[] = {1,2,2,3,4,4,5,6,7,8,10,45};
vector<int> v(input,input+12);
vector<int>::iterator it1 ,it2,it3,it4;
it1 = lower_bound(v.begin(), v.end(), 4);
/* points to fifth element in v */
it2 = lower_bound (v.begin(), v.end(), 10);
/* points to second last element in v */
it3= upper_bound(v.begin(), v.end(), 6);
/* points to eight element in v */
it4= upper_bound(v.begin(), v.end(), 4);
/* points to seventh element in v */
return 0;
}