|
VMS Help CXXLSTD, Algorithms, upper_bound *Conan The Librarian |
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
upper_bound - Determines the last valid position for a value in a
sorted container.
SYNOPSIS
#include <algorithm>
template <class ForwardIterator, class T>
ForwardIterator
upper_bound(ForwardIterator first, ForwardIterator last,
const T& value);
template <class ForwardIterator, class T, class Compare>
ForwardIterator
upper_bound(ForwardIterator first, ForwardIterator last,
const T& value, Compare comp);
DESCRIPTION
The upper_bound algorithm is part of a set of binary search
algorithms. All of these algorithms perform binary searches on
ordered containers. Each algorithm has two versions. The first
version uses the less than operator (operator<) to perform the
comparison, and assumes that the sequence has been sorted using that
operator. The second version allows you to include a function
object of type Compare, and assumes that Compare is the function
used to sort the sequence. The function object must be a binary
predicate.
The upper_bound algorithm finds the last position in a container
that value can occupy without violating the container's ordering.
upper_bound's return value is the iterator for the first element in
the container that is greater than value, or, when the comparison
operator is used, the first element that does not satisfy the
comparison function. Because the algorithm is restricted to using
the less than operator or the user-defined function to perform
the search, upper_bound returns an iterator i in the range
[first, last) such that for any iterator j in the range
[first, i) the appropriate version of the following conditions
holds:
!(value < *j)
or
comp(value, *j) == false
COMPLEXITY
upper_bound performs at most log(last - first) + 1 comparisons.
EXAMPLE
//
// ul_bound.cpp
//
#include <vector>
#include <algorithm>
#include <iostream.h>
int main()
{
typedef vector<int>::iterator iterator;
int d1[11] = {0,1,2,2,3,4,2,2,2,6,7};
// Set up a vector
vector<int> v1(d1,d1 + 11);
// Try lower_bound variants
iterator it1 = lower_bound(v1.begin(),v1.end(),3);
// it1 = v1.begin() + 4
iterator it2 =
lower_bound(v1.begin(),v1.end(),2,less<int>());
// it2 = v1.begin() + 4
// Try upper_bound variants
iterator it3 = upper_bound(v1.begin(),v1.end(),3);
// it3 = vector + 5
iterator it4 =
upper_bound(v1.begin(),v1.end(),2,less<int>());
// it4 = v1.begin() + 5
cout << endl << endl
<< "The upper and lower bounds of 3: ( "
<< *it1 << " , " << *it3 << " ]" << endl;
cout << endl << endl
<< "The upper and lower bounds of 2: ( "
<< *it2 << " , " << *it4 << " ]" << endl;
return 0;
}
Output :
The upper and lower bounds of 3: ( 3 , 4 ]
The upper and lower bounds of 2: ( 2 , 3 ]
WARNING
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you will need to write :
vector<int, allocator<int> >
instead of :
vector<int>
SEE ALSO
lower_bound, equal_range
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
|
|