Почему не условие * First1 == * First2 ??(C ++ STL включает в себя функцию реализации) - PullRequest
3 голосов
/ 24 апреля 2019

Я студент, изучающий STL C ++, и у меня простой вопрос.

Мне было интересно узнать, как реализовать функцию include в библиотеке алгоритмов. Смотрите этот код (этот код от https://en.cppreference.com/w/cpp/algorithm/includes)

template<class InputIt1, class InputIt2> 
bool includes(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) {
    for (; first2 != last2; ++first1) {
        if (first1 == last1 || *first2 < *first1)
            return false;
        if ( !(*first1 < *first2) )
            ++first2;
    }
    return true;
}

В этом разделе есть вопросы.

if ( !(*first1 < *first2) )
            ++first2;

Эта часть отображается в виде кода, который определяет, равен ли *first1 *first2, чтобы определить, является ли данная частичная последовательность частью упорядоченной последовательности. Я думаю.

Если так, то *first1 == * first2 кажется достаточно, мне интересно, почему !(first1 < first2).

Есть ли какие-либо особые причины для этого состояния ??

Ответы [ 2 ]

4 голосов
/ 24 апреля 2019

Одна из концепций , требуемая типом InputIt1, заключается в том, что она реализует оператор <.(Другие компараторы ==, !=, <=, >= и > могут быть записаны в терминах <, если вы разрешите отрицание выражения с помощью !, хотя формально это заменаиз == известен как эквивалентность .)

Поэтому стандартная библиотечная функция C ++ записывает проверку условия в терминах <.

Ссылка: https://en.cppreference.com/w/cpp/named_req/LessThanComparable

2 голосов
/ 24 апреля 2019

Требование равенства является излишне сильным условием; строгий слабый порядок (который < должен быть ) достаточен.

Обратите внимание, что !(*first2 < *first1) подразумевается как ложное предыдущее условие, поэтому first2 увеличивается, когда *first1 и *first2 эквивалентны в соответствии с порядком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...