equal_range
Returns the range of elements equal to a given value
Key Facts
Gyroscopic Couple: The rate of change of angular momentum () = (In the limit).- = Moment of Inertia.
- = Angular velocity
- = Angular velocity of precession.
Blaise Pascal (1623-1662) was a French mathematician, physicist, inventor, writer and Catholic philosopher.
Leonhard Euler (1707-1783) was a pioneering Swiss mathematician and physicist.
Definition
The equal_range() algorithm is defined in the standard header <algorithm> and in the nonstandard backward-compatibility header <algo.h>.Interface
#include <algorithm> template < class ForwardIterator, class Type > pair<ForwardIterator, ForwardIterator> equal_range( ForwardIterator first, ForwardIterator last, const Type& val ); template < class ForwardIterator, class Type, class Predicate > pair<ForwardIterator, ForwardIterator> equal_range( ForwardIterator first, ForwardIterator last, const Type& val, Predicate comp );Parameters:
Parameter | Description |
---|---|
first | A forward iterator addressing the position of the first element in the range to be searched |
last | A forward iterator addressing the position one past the final element in the range to be searched |
val | The value in the ordered range that needs to be equivalent to the value of the element addressed by the first component of the pair returned and that needs to be less than the value of the element addressed by the second component of that pair returns |
comp | User-defined predicate function object that is true when the left-hand argument is less than the right-hand argument. The user-defined predicate function should return false when its arguments are equivalent |
Description
Equal_range function get the lower bound and the upper bound of a range where a new value can be inserted without misordering the elements betweenfirst
and last
.
The first version uses operator<
for comparison, and the second uses the function object comp
.Return Value
Returns a pair of forward iterators that specify a subrange, contained within the range searched, in which all of the elements are equivalent toval
in the sense defined by the binary predicate used (either comp
or the default, less-than).Example:
Example - equal_range algorithm
Problem
This program illustrates the use of the STL equal_range() algorithm (default
version) to find the lower bound and upper bound locations of a given target
value in a vector of integers sorted in ascending order.
Workings
#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)<<" "; pair<vector<int>::iterator, vector<int>::iterator> bounds; bounds = equal_range(v.begin(), v.end(), 3); if (bounds.first != v.end()) cout <<"\nLower bound of 3 in v = "<<*bounds.first; if (bounds.first != v.end()) cout <<"\nUpper bound of 3 in v = "<<*bounds.second; bounds = equal_range(v.begin(), v.end(), 4); if (bounds.first != v.end()) cout <<"\nLower bound of 4 in v = "<<*bounds.first; if (bounds.first != v.end()) cout <<"\nUpper bound of 4 in v = "<<*bounds.second; bounds = equal_range(v.begin(), v.end(), 5); if (bounds.first != v.end()) cout <<"\nLower bound of 5 in v = "<<*bounds.first; if (bounds.first != v.end()) cout <<"\nUpper bound of 5 in v = "<<*bounds.second; bounds = equal_range(v.begin(), v.end(), 7); if (bounds.first != v.end()) cout <<"\nLower bound of 7 in v = "<<*bounds.first; cout <<"\nThis is the first of the three 7's, since the value " "before this 7 is "<<*(bounds.first-1)<<"."; if (bounds.first != v.end()) cout <<"\nUpper bound of 7 in v = "<<*bounds.second; bounds = equal_range(v.begin(), v.end(), 0); if (bounds.first != v.end()) cout <<"\nLower bound of 0 in v = "<<*bounds.first; if (bounds.first != v.end()) cout <<"\nUpper bound of 0 in v = "<<*bounds.second; bounds = equal_range(v.begin(), v.end(), 15); if (bounds.first != v.end()) cout <<"\nLower bound of 15 in v = "<<*bounds.first; if (bounds.first != v.end()) cout <<"\nUpper bound of 15 in v = "<<*bounds.second; cout <<"\nNote that both the lower and upper bound locations " "\nof 15 are the end (one-past-the-last) vector position."; return 0; }
Solution
Output:
Here are the contents of v:
2 3 5 6 7 7 7 8 9 10 Lower bound of 3 in v = 3
Upper bound of 3 in v = 5 Lower bound of 4 in v = 5
Upper bound of 4 in v = 5 Lower bound of 5 in v = 5
Upper bound of 5 in v = 6 Lower bound of 7 in v = 7
This is the first of the three 7's, since the value before this 7 is 6.
Upper bound of 7 in v = 8 Lower bound of 0 in v = 2 Upper bound of 0 in v = 2 Note that both the lower and upper bound locations of 15 are the end (one-past-the-last) vector position.
2 3 5 6 7 7 7 8 9 10 Lower bound of 3 in v = 3
Upper bound of 3 in v = 5 Lower bound of 4 in v = 5
Upper bound of 4 in v = 5 Lower bound of 5 in v = 5
Upper bound of 5 in v = 6 Lower bound of 7 in v = 7
This is the first of the three 7's, since the value before this 7 is 6.
Upper bound of 7 in v = 8 Lower bound of 0 in v = 2 Upper bound of 0 in v = 2 Note that both the lower and upper bound locations of 15 are the end (one-past-the-last) vector position.
References