# Implementation of lower_bound and upper_bound on Set of Pairs in C++

• Difficulty Level : Basic
• Last Updated : 22 Jul, 2020

lower_bound() returns an iterator pointing to the first element in the range [first, last) which has a value greater than or equals to the given value “val”. But in set of Pairs lower_bound() for pair(x, y) will return an iterator pointing to the position of pair whose the first value is greater than or equals x.
If first values are same, then it will return an iterator pointing to the position of pair whose the second value is greater than or equals y.
If the above-mentioned criteria are not met, then it returns an iterator which points to end of the set (next to the last pair in set).

Syntax: There are two ways to use lower_bound():

setName.lower_bound({a, b})

lower_bound(setName.begin(), setName.end(), pair(a, b))

upper_bound() returns an iterator pointing to the first element in the range [first, last) which has a value greater than the given value “val”. But in set of Pairs upper_bound() for pair(x, y) will return an iterator pointing to the position of pair whose the first value is greater than x.
If first values are same, then it will return an iterator pointing to the position of pair whose the second value is greater than y.
If the above-mentioned criteria are not met, then it returns an iterator which points to end of the set (next to the last pair in set).

Syntax: There are two ways to use upper_bound() with Set:

setName.upper_bound({a, b})

upper_bound(setName.begin(), setName.end(), pair(a, b))

Below is the program to demonstrate lower_bound() and upper_bound() in set of pairs:

 `// C++ program to demonstrate lower_bound()``// and upper_bound() in set of Pairs`` ` `#include ``using` `namespace` `std;`` ` `// Function to implement lower_bound()``void` `findLowerBound(``    ``set >& arr,``    ``pair<``int``, ``int``>& p)``{`` ` `    ``// Given iterator points to the``    ``// lower_bound() of given pair``    ``auto` `low = lower_bound(arr.begin(),``                           ``arr.end(), p);`` ` `    ``cout << ``"lower_bound() for {1, 2}"``         ``<< ``" is: {"` `<< (*low).first << ``", "``         ``<< (*low).second << ``"}"` `<< endl;``}`` ` `// Function to implement upper_bound()``void` `findUpperBound(``    ``set >& arr,``    ``pair<``int``, ``int``>& p)``{`` ` `    ``// Given iterator points to the``    ``// lower_bound() of given pair``    ``auto` `up = upper_bound(arr.begin(),``                          ``arr.end(), p);`` ` `    ``cout << ``"upper_bound() for {1, 2}"``         ``<< ``" is: {"` `<< (*up).first << ``", "``         ``<< (*up).second << ``"}"` `<< endl;``}`` ` `// Driver Code``int` `main()``{`` ` `    ``// Given sorted vector of Pairs``    ``set > s;`` ` `    ``// Insert pairs in set``    ``s.insert(make_pair(1, 2));``    ``s.insert(make_pair(2, 4));``    ``s.insert(make_pair(3, 7));``    ``s.insert(make_pair(8, 9));`` ` `    ``// Given pair { 1, 2 }``    ``pair<``int``, ``int``> p = { 1, 2 };`` ` `    ``// Function Call to find lower_bound``    ``// of pair p in arr``    ``findLowerBound(s, p);`` ` `    ``// Function Call to find upper_bound``    ``// of pair p in arr``    ``findUpperBound(s, p);`` ` `    ``return` `0;``}`

Output:

```lower_bound() for {1, 2} is: {1, 2}
upper_bound() for {1, 2} is: {2, 4}
```

My Personal Notes arrow_drop_up