TheDeveloperBlog.com

Home | Contact Us

C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML

C++ algorithm upper_bound() function

C++ algorithm upper_bound() function with c++ tutorial for beginners and professionals with examples on adjacent_find(),any_of(), copy(), copy_if(), count(), count_if(), equal(), find(), find_end(), find_first_of(), find_if(), find_if_not(), for_each() etc.

<< Back to CPP

C++ Algorithm upper_bound()

C++ Algorithm upper_bound() function is the version of binary search. This function is used to return an iterator pointing to the first element in the range [first, last) that is greater than to the specified value val.

The first version uses operator < to compare the elements and the second version uses the given comparison function i.e. comp.

Syntax

default (1)      template <class ForwardIterator, class T>
                          ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
                               const T& val); 

custom (2)      template <class ForwardIterator, class T, class Compare>
                          ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
                               const T& val, Compare comp);

Parameter

first: A forward iterator pointing to the first element in the range to be searched.

last: A forward iterator pointing to the past last element in the range to be searched.

comp: A user defined binary predicate function that accepts two arguments and returns true if the two arguments are in order and false otherwise. It follows the strict weak ordering to order the elements.

val: A value of the upper bound to compare the elements in the range.

Return value

It returns an iterator pointing to the first element of the range that is greater than val or last if no such element is found.

Complexity

On average, complexity is logarithmic in the distance between first and last: performs up to log2 (N) + 1 element comparisons Where N = last - first.

Data races

The object in the range [first, last) are accessed.

Exceptions

This function throws an exception if either an element comparison or an operation on iterator throws an exception.

Note: The invalid parameters cause an undefined behavior.

Example 1

Let's see the simple example to demonstrate the use of upper_bound():

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{

  vector<int> v = {3, 1, 4, 6, 5};
  
  decltype(v)::iterator it = upper_bound(v.begin(), v.end(), 3);
  cout<<"Upper bound of 3 is: ";
  cout << *it << endl;
  
  return 0;
}

Output:

Upper bound of 3 is: 4

Example 2

Let's see another simple example:

#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
#include <vector>       // std::vector

using namespace std;

int main () {
  int myints[] = {10,20,30,30,20,10,10,20};
  vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20

  sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30

  vector<int>::iterator low,up;
  low=lower_bound (v.begin(), v.end(), 20); //          ^
  up= upper_bound (v.begin(), v.end(), 20); //                   ^

  cout << "lower_bound at position " << (low- v.begin()) << '\n';
  cout << "upper_bound at position " << (up - v.begin()) << '\n';

  return 0;
}

Output:

lower_bound at position 3
upper_bound at position 6

Example 3

Let's see another simple example:

#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
  int a[] = {2, 3, 5, 6, 7, 7, 7,  8, 9, 10};
  vector<int> v(a, a+10);
  cout <<"\nHere are the contents of v:\n";
  for (vector<int>::size_type i=0; i<v.size(); i++)
    cout <<v.at(i)<<" ";  
 
  vector<int>::iterator upper;
 
  upper = upper_bound(v.begin(), v.end(), 3);
  if (upper != v.end())
    cout <<"\nUpper bound of 3 in v = "<<*upper;
 
  upper = upper_bound(v.begin(), v.end(), 4);
  if (upper != v.end())
    cout <<"\nUpper bound of 4 in v = "<<*upper;
 
  upper = upper_bound(v.begin(), v.end(), 5);
  if (upper != v.end())
    cout <<"\nUpper bound of 5 in v = "<<*upper;
 
  upper = upper_bound(v.begin(), v.end(), 7);
  if (upper != v.end())
    cout <<"\nUpper bound of 7 in v = "<<*upper;
 
  upper = upper_bound(v.begin(), v.end(), 0);
  if (upper != v.end())
    cout <<"\nUpper bound of 0 in v = "<<*upper;
 
  upper = upper_bound(v.begin(), v.end(), 15);
  if (upper != v.end())
    cout <<"\nUpper bound of 15 in v = "<<*upper;
  cout <<"\n\nNote that the upper bound location of 15 is \nthe end (one-past-the-last) vector position.";
 
  return 0;
}

Output:

Here are the contents of v:
2 3 5 6 7 7 7 8 9 10 
Upper bound of 3 in v = 5
Upper bound of 4 in v = 5
Upper bound of 5 in v = 6
Upper bound of 7 in v = 8
Upper bound of 0 in v = 2

Note that the upper bound location of 15 is 
the end (one-past-the-last) vector position.

Example 4

Let's see another simple example:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool ignore_case(char a, char b) {
   return(tolower(a) == tolower(b));
}

int main(void) {
   vector<char> v = {'A', 'b', 'C', 'd', 'E'};
   auto it = upper_bound(v.begin(), v.end(), 'C');

   cout << "Upper bound of \'C\' is " << *it << endl;

   it = upper_bound(v.begin(), v.end(), 'C', ignore_case);

   cout << "Upper bound of \'C\' is " << *it << endl;

   it = upper_bound(v.begin(), v.end(), 'z', ignore_case);

   cout << "All elements are less than \'z\'." << endl;

   return 0;
}

Output:

Upper bound of 'C' is d
Upper bound of 'C' is C
All elements are less than 'z'.

Next TopicC++ Algorithm




Related Links:


Related Links

Adjectives Ado Ai Android Angular Antonyms Apache Articles Asp Autocad Automata Aws Azure Basic Binary Bitcoin Blockchain C Cassandra Change Coa Computer Control Cpp Create Creating C-Sharp Cyber Daa Data Dbms Deletion Devops Difference Discrete Es6 Ethical Examples Features Firebase Flutter Fs Git Go Hbase History Hive Hiveql How Html Idioms Insertion Installing Ios Java Joomla Js Kafka Kali Laravel Logical Machine Matlab Matrix Mongodb Mysql One Opencv Oracle Ordering Os Pandas Php Pig Pl Postgresql Powershell Prepositions Program Python React Ruby Scala Selecting Selenium Sentence Seo Sharepoint Software Spellings Spotting Spring Sql Sqlite Sqoop Svn Swift Synonyms Talend Testng Types Uml Unity Vbnet Verbal Webdriver What Wpf