1·
std::lower_bound
default (1) | template <class ForwardIterator, class T> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val); |
---|---|
custom (2) | template <class ForwardIterator, class T, class Compare> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp); |
Return iterator to lower bound
Returns an iterator pointing to the first element in the range
[first,last)
which does not compare less than
val.
The elements are compared using
operator<
for the first version, and
comp for the second. The elements in the range shall already be
sorted according to this same criterion (
operator<
or
comp), or at least
partitioned with respect to
val.
The function optimizes the number of comparisons performed by comparing non-consecutive elements of the sorted range, which is specially efficient for random-access iterators.
Unlike upper_bound, the value pointed by the iterator returned by this function may also be equivalent to val, and not only greater.
The behavior of this function template is equivalent to:
| |
#include <iostream> // std::cout
#include <algorithm> // std::lower_bound, std::upper_bound, std::sort
#include <vector> // std::vector
int main () {
int myints[] = {10,20,30,30,20,10,10,20};
std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
std::vector<int>::iterator low,up;
low=std::lower_bound (v.begin(), v.end(), 20); // ^
up= std::upper_bound (v.begin(), v.end(), 20); // ^
std::cout << "lower_bound at position " << (low- v.begin()) << '\n';
std::cout << "upper_bound at position " << (up - v.begin()) << '\n';
return 0;
}
std::upper_bound
<algorithm>
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); |
Return iterator to upper bound
Returns an iterator pointing to the first element in the range
[first,last)
which compares greater than
val.
The elements are compared using
operator<
for the first version, and
comp for the second. The elements in the range shall already be
sorted according to this same criterion (
operator<
or
comp), or at least
partitioned with respect to
val.
The function optimizes the number of comparisons performed by comparing non-consecutive elements of the sorted range, which is specially efficient for random-access iterators.
Unlike lower_bound, the value pointed by the iterator returned by this function cannot be equivalent to val, only greater.
The behavior of this function template is equivalent to:
| |
// lower_bound/upper_bound example
#include <iostream> // std::cout
#include <algorithm> // std::lower_bound, std::upper_bound, std::sort
#include <vector> // std::vector
int main () {
int myints[] = {10,20,30,30,20,10,10,20};
std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
std::vector<int>::iterator low,up;
low=std::lower_bound (v.begin(), v.end(), 20); // ^
up= std::upper_bound (v.begin(), v.end(), 20); // ^
std::cout << "lower_bound at position " << (low- v.begin()) << '\n';
std::cout << "upper_bound at position " << (up - v.begin()) << '\n';
return 0;
}
std::equal_range
<algorithm>
default (1) | template <class ForwardIterator, class T> pair<ForwardIterator,ForwardIterator> equal_range (ForwardIterator first, ForwardIterator last, const T& val); |
---|---|
custom (2) | template <class ForwardIterator, class T, class Compare> pair<ForwardIterator,ForwardIterator> equal_range (ForwardIterator first, ForwardIterator last, const T& val, Compare comp); |
Get subrange of equal elements
Returns the bounds of the subrange that includes all the elements of the range
[first,last)
with values equivalent to
val.
The elements are compared using
operator<
for the first version, and
comp for the second. Two elements,
a and
bare considered equivalent if
(!(a<b) && !(b<a))
or if
(!comp(a,b) && !comp(b,a))
.
The elements in the range shall already be sorted according to this same criterion (
operator<
or
comp), or at least
partitioned with respect to
val.
If val is not equivalent to any value in the range, the subrange returned has a length of zero, with both iterators pointing to the nearest value greater than val, if any, or to last, if val compares greater than all the elements in the range.
The behavior of this function template is equivalent to:
| |
// equal_range example
// equal_range example
#include <iostream> // std::cout
#include <algorithm> // std::equal_range, std::sort
#include <vector> // std::vector
bool mygreater (int i,int j) { return (i>j); }
int main () {
int myints[] = {10,20,30,30,20,10,10,20};
std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds;
// using default comparison:
std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
bounds=std::equal_range (v.begin(), v.end(), 20); // ^ ^
// using "mygreater" as comp:
std::sort (v.begin(), v.end(), mygreater); // 30 30 20 20 20 10 10 10
bounds=std::equal_range (v.begin(), v.end(), 20, mygreater); // ^ ^
std::cout << "bounds at positions " << (bounds.first - v.begin());
std::cout << " and " << (bounds.second - v.begin()) << '\n';
return 0;
}
std::binary_search
<algorithm>
default (1) | template <class ForwardIterator, class T> bool binary_search (ForwardIterator first, ForwardIterator last, const T& val); |
---|---|
custom (2) | template <class ForwardIterator, class T, class Compare> bool binary_search (ForwardIterator first, ForwardIterator last, const T& val, Compare comp); |
Test if value exists in sorted sequence
Returns
true
if any element in the range
[first,last)
is equivalent to
val, and
false
otherwise.
The elements are compared using
operator<
for the first version, and
comp for the second. Two elements,
a and
bare considered equivalent if
(!(a<b) && !(b<a))
or if
(!comp(a,b) && !comp(b,a))
.
The elements in the range shall already be sorted according to this same criterion (
operator<
or
comp), or at least
partitioned with respect to
val.
The function optimizes the number of comparisons performed by comparing non-consecutive elements of the sorted range, which is specially efficient for random-access iterators.
The behavior of this function template is equivalent to:
| |
Example
| |
Output:
looking for a 3... found! looking for a 6... not found. |