std::lexicographical_compare

From Cppreference

Jump to: navigation, search
Defined in header <algorithm>

template< class InputIterator1, class InputIterator2 >

bool lexicographical_compare( InputIterator1 first1, InputIterator1 last1,

                              InputIterator2 first2, InputIterator2 last2 );
(1)
template< class InputIterator1, class InputIterator2, class Compare >

bool lexicographical_compare( InputIterator1 first1, InputIterator1 last1,
                              InputIterator2 first2, InputIterator2 last2,

                              Compare comp );
(2)

Checks if the first range [first1, last1) is lexicographically less than the second range [first2, last2). The first version uses ​operator< to compare the elements, the second version uses the given comparison function comp.

Lexicographical comparison is a operation with the following properties:

Contents

Parameters

first1, last1 - the first range of elements to examine
first2, last2 - the second range of elements to examine
comp - comparison function which returns ​true if the first argument is less than the second.

The signature of the comparison function should be equivalent to the following:

bool cmp(const Type1 &a, const Type2 &b);

The signature does not need to have const &, but the function must not modify the objects passed to it.
The types ​Type1​ and ​Type2​ must be such that objects of types ​InputIterator1​ and ​InputIterator2​ can be dereferenced and then implicitly converted to ​Type1​ and ​Type2​ respectively.

Return value

true if the first range is lexicographically less than the second.

Complexity

At most 2 * min(count1, count2) applications of the comparison operation, where ​count1 = std::distance(first1, last1) and ​count2 = std::distance(first2, last2).

Equivalent function

First version:
template<class InputIterator1, class InputIterator2>
bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
                             InputIterator2 first2, InputIterator2 last2)
{
    for ( ; (first1 != last1) && (first2 != last2) ; first1++, first2++ ) {
        if (*first1 < *first2) return true;
        if (*first2 < *first1) return false;
    }
    return (first1 == last1) && (first2 != last2);
}
Second version:
template<class InputIterator1, class InputIterator2, class Compare>
bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
                             InputIterator2 first2, InputIterator2 last2,
                             Compare comp)
{
    for ( ; (first1 != last1) && (first2 != last2) ; first1++, first2++ ) {
        if (comp(*first1, *first2)) return true;
        if (comp(*first2, *first1)) return false;
    }
    return (first1 == last1) && (first2 != last2);
}

Example

Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
In other languages