function template
<algorithm>
std::lexicographical_compare
default (1) | template <class InputIterator1, class InputIterator2> bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); |
---|
custom (2) | template <class InputIterator1, class InputIterator2, class Compare> bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); |
---|
Lexicographical less-than comparison
Returns true
if the range [first1,last1)
compares lexicographically less than the range [first2,last2)
.
A lexicographical comparison is the kind of comparison generally used to sort words alphabetically in dictionaries; It involves comparing sequentially the elements that have the same position in both ranges against each other until one element is not equivalent to the other. The result of comparing these first non-matching elements is the result of the lexicographical comparison.
If both sequences compare equal until one of them ends, the shorter sequence is lexicographically less than the longer one.
The elements are compared using operator<
for the first version, and comp for the second. Two elements, a and b are considered equivalent if (!(a<b) && !(b<a))
or if (!comp(a,b) && !comp(b,a))
.
The behavior of this function template is equivalent to:
1 2 3 4 5 6 7 8 9 10 11 12
|
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2)
{
while (first1!=last1)
{
if (first2==last2 || *first2<*first1) return false;
else if (*first1<*first2) return true;
++first1; ++first2;
}
return (first2!=last2);
}
|
Parameters
- first1, last1
- Input iterators to the initial and final positions of the first sequence. The range used is
[first1,last1)
, which contains all the elements between first1 and last1, including the element pointed by first1 but not the element pointed by last1.
- first2, last2
- Input iterators to the initial and final positions of the second sequence. The range used is
[first2,last2)
.
- comp
- Binary function that accepts two arguments of the types pointed by the iterators, and returns a value convertible to
bool
. The value returned indicates whether the first argument is considered to go before the second in the specific strict weak ordering it defines.
The function shall not modify any of its arguments.
This can either be a function pointer or a function object.
Return value
true
if the first range compares lexicographically less than the second.
false
otherwise (including when all the elements of both ranges are equivalent).
Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
// lexicographical_compare example
#include <iostream> // std::cout, std::boolalpha
#include <algorithm> // std::lexicographical_compare
#include <cctype> // std::tolower
// a case-insensitive comparison function:
bool mycomp (char c1, char c2)
{ return std::tolower(c1)<std::tolower(c2); }
int main () {
char foo[]="Apple";
char bar[]="apartment";
std::cout << std::boolalpha;
std::cout << "Comparing foo and bar lexicographically (foo<bar):\n";
std::cout << "Using default comparison (operator<): ";
std::cout << std::lexicographical_compare(foo,foo+5,bar,bar+9);
std::cout << '\n';
std::cout << "Using mycomp as comparison object: ";
std::cout << std::lexicographical_compare(foo,foo+5,bar,bar+9,mycomp);
std::cout << '\n';
return 0;
}
|
The default comparison compares plain ASCII character codes, where 'A'
(65) compares less than 'a'
(97).
Our mycomp function transforms the letters to lowercase before comparing them, so here the first letter not matching is the third ('a'
vs 'p'
).
Output:
Comparing foo and bar lexicographically (foo<bar):
Using default comparison (operator<): true
Using mycomp as comparison object: false
|
Complexity
At most, performs
2*min(count1,count2)
comparisons or applications of
comp (where
countX is the distance between
firstX and
lastX).
Complexity
Up to linear in 2*min(count1,count2)
(where countX is the distance between firstX and lastX): Compares elements symmetrically until a mismatch is found.
Data races
The objects in the ranges [first1,last1)
and [first2,last2)
are accessed.
Exceptions
Throws if either an element comparison or an operation on an iterator throws.
Note that invalid arguments cause undefined behavior.
See also
- mismatch
- Return first position where two ranges differ (function template)
- equal
- Test whether the elements in two ranges are equal (function template)
- search
- Search range for subsequence (function template)
- find_end
- Find last subsequence in range (function template)
- includes
- Test whether sorted range includes another sorted range (function template)