для проверки будет использовать его. Перед вызовом
equal
убедитесь, что каждая последовательность имеет одинаковую длину. Он предполагает, что второй диапазон не меньше первого, и если это не так, то его поведение не определено.
Если требуется узнать, где и как последовательности отличаются, используйте
lexicographical_compare
или
mismatch
.
lexicographical_compare
сравнивает две последовательности и возвращает истину, если первая лексикографически меньше второй, что означает, что каждая пара элементов в двух последовательностях сравнивается с помощью оператора
возвращает истину или первая последовательность заканчивается раньше второй, то возвращается истина. В противном случае возвращается ложь. Рассмотрим последовательность символов из примера 7.4.
линейна и выполняет число сравнений, равное длине меньшей из двух последовательностей, или до тех пор, пока один из элементов в одной из последовательностей не окажется меньше соответствующего элемента другой. Сравнения реализованы полностью на основе
operator<
, так что если
iter1
и
iter2
— это итераторы двух последовательностей, то сравнение останавливается
тогда, когда
*iter1 < *iter2
или
*iter2 < *iter1
.
mismatch
говорит, где две последовательности различаются. Однако его объявление несколько отличается от
Вы должны убедиться, что длина второго диапазона не меньше первого. Если вторая последовательность короче первой,
mismatch
не сможет узнать этого и продолжит выполнение сравнения элементов за границей второй последовательности, что приведет к непредсказуемому поведению. Кроме того, если несовпадений нет, то первый итератор будет указывать на
last1
, который может оказаться недействительным (например, если в качестве
last1
передать
end
.
Вы, должно быть, заметили по объявлениям каждой из этих функций, что типы итераторов для каждой из этих последовательностей различны. Это означает, что две последовательности могут быть контейнерами разных типов, но при условии, что типы элементов, на которые указывают итераторы, имеют определенный для них
Здесь каждый символ двух последовательностей сравнивается вне зависимости от типа контейнера, в которых они хранятся.
Стандартная библиотека C++ предоставляет несколько различных способов сравнения последовательностей. Если ни один из них вам не подходит, посмотрите на их исходный код — он является хорошим примером того, как надо писать собственные эффективные обобщенные алгоритмы.
Смотри также
Рецепт 7.1.
7.5. Объединение данных
Проблема
Имеется две отсортированные последовательности и их требуется объединить.
Решение
Используйте либо шаблон функции
merge
, либо шаблон функции
inplace_merge
.
merge
объединяет две последовательности и помещает результат в третью, a
inplace_merge
объединяет две последовательно расположенные последовательности. Пример 7.5 показывает, как это делается.