Namespaces
Variants

std:: lexicographical_compare

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
lexicographical_compare
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Определено в заголовке <algorithm>
template < class InputIt1, class InputIt2 >

bool lexicographical_compare ( InputIt1 first1, InputIt1 last1,

InputIt2 first2, InputIt2 last2 ) ;
(1) (constexpr since C++20)
template < class ExecutionPolicy,

class ForwardIt1, class ForwardIt2 >
bool lexicographical_compare ( ExecutionPolicy && policy,
ForwardIt1 first1, ForwardIt1 last1,

ForwardIt2 first2, ForwardIt2 last2 ) ;
(2) (since C++17)
template < class InputIt1, class InputIt2, class Compare >

bool lexicographical_compare ( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,

Compare comp ) ;
(3) (constexpr since C++20)
template < class ExecutionPolicy,

class ForwardIt1, class ForwardIt2, class Compare >
bool lexicographical_compare ( ExecutionPolicy && policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2,

Compare comp ) ;
(4) (since C++17)

Проверяет, является ли первый диапазон [ first1 , last1 ) лексикографически меньшим , чем второй диапазон [ first2 , last2 ) .

1) Элементы сравниваются с помощью operator < .
3) Элементы сравниваются с использованием заданной бинарной функции сравнения comp .
2,4) То же, что (1,3) , но выполняется в соответствии с policy . Эти перегрузки участвуют в разрешении перегрузки только при выполнении всех следующих условий:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> равно true .

(до C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> равно true .

(начиная с C++20)

Лексикографическое сравнение — это операция со следующими свойствами:

  • Два диапазона сравниваются поэлементно.
  • Первый несовпадающий элемент определяет, какой диапазон лексикографически меньше или больше другого.
  • Если один диапазон является префиксом другого, более короткий диапазон лексикографически меньше другого.
  • Если два диапазона имеют эквивалентные элементы и одинаковую длину, то диапазоны лексикографически равны .
  • Пустой диапазон лексикографически меньше любого непустого диапазона.
  • Два пустых диапазона лексикографически равны .

Содержание

Параметры

first1, last1 - пара итераторов, определяющих первый диапазон элементов для проверки
first2, last2 - пара итераторов, определяющих второй диапазон элементов для проверки
policy - политика выполнения, которая будет использоваться
comp - функциональный объект сравнения (т.е. объект, удовлетворяющий требованиям Compare ), который возвращает true если первый аргумент меньше второго.

Сигнатура функции сравнения должна быть эквивалентна следующей:

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

Хотя сигнатура не обязана содержать const & , функция не должна модифицировать переданные ей объекты и должна быть способна принимать все значения типа (возможно const) Type1 и Type2 независимо от категории значения (следовательно, Type1 & не допускается , как и Type1 , если для Type1 перемещение не эквивалентно копированию (начиная с C++11) ).
Типы Type1 и Type2 должны быть такими, чтобы объекты типов InputIt1 и InputIt2 могли быть разыменованы и затем неявно преобразованы как в Type1 , так и в Type2 .

Требования к типам
-
InputIt1, InputIt2 должны удовлетворять требованиям LegacyInputIterator .
-
ForwardIt1, ForwardIt2 должны удовлетворять требованиям LegacyForwardIterator .
-
Compare должен удовлетворять требованиям Compare .

Возвращаемое значение

true если первый диапазон лексикографически меньше второго, в противном случае false .

Сложность

Пусть N 1 равно std:: distance ( first1, last1 ) и N 2 равно std:: distance ( first2, last2 ) :

1,2) Не более 2min( 1 ,N 2 ) сравнений с использованием operator < .
3,4) Не более 2min(N 1 ,N 2 ) применений функции сравнения comp .

Исключения

Перегрузки с параметром шаблона с именем ExecutionPolicy сообщают об ошибках следующим образом:

  • Если выполнение функции, вызванной как часть алгоритма, выбрасывает исключение и ExecutionPolicy является одним из стандартных политик , std::terminate вызывается. Для любой другой ExecutionPolicy поведение определяется реализацией.
  • Если алгоритму не удается выделить память, std::bad_alloc выбрасывается.

Возможная реализация

lexicographical_compare (1)
template<class InputIt1, class InputIt2>
bool lexicographical_compare(InputIt1 first1, InputIt1 last1,
                             InputIt2 first2, InputIt2 last2)
{
    for (; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2)
    {
        if (*first1 < *first2)
            return true;
        if (*first2 < *first1)
            return false;
    }
    return (first1 == last1) && (first2 != last2);
}
lexicographical_compare (3)
template<class InputIt1, class InputIt2, class Compare>
bool lexicographical_compare(InputIt1 first1, InputIt1 last1,
                             InputIt2 first2, InputIt2 last2, Compare comp)
{
    for (; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2)
    {
        if (comp(*first1, *first2))
            return true;
        if (comp(*first2, *first1))
            return false;
    }
    return (first1 == last1) && (first2 != last2);
}
**Примечание:** Весь код C++ внутри тегов `
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.

Пример

#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
void print(const std::vector<char>& v, auto suffix)
{
    for (char c : v)
        std::cout << c << ' ';
    std::cout << suffix;
}
int main()
{
    std::vector<char> v1{'a', 'b', 'c', 'd'};
    std::vector<char> v2{'a', 'b', 'c', 'd'};
    for (std::mt19937 g{std::random_device{}()};
         !std::lexicographical_compare(v1.begin(), v1.end(),
                                       v2.begin(), v2.end());)
    {
        print(v1, ">= ");
        print(v2, '\n');
        std::shuffle(v1.begin(), v1.end(), g);
        std::shuffle(v2.begin(), v2.end(), g);
    }
    print(v1, "<  ");
    print(v2, '\n');
}

Возможный вывод:

a b c d >= a b c d 
d a b c >= c b d a 
b d a c >= a d c b 
a c d b <  c d a b

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 142 C++98 at most min(N 1 ,N 2 ) comparisons were allowed, but that
is not possible (equivalence is determined by 2 comparisons)
doubled the limit
LWG 1205 C++98 the results of lexicographical comparisons involving empty ranges were unclear made clear

Смотрите также

определяет, являются ли два набора элементов одинаковыми
(шаблон функции)
сравнивает два диапазона с использованием трёхстороннего сравнения
(шаблон функции)
возвращает true если один диапазон лексикографически меньше другого
(функциональный объект алгоритма)