Файл заголовка mismatch.hpp содержит два варианта алгоритма stl.<mismatch
>. Алгоритм находит первую точку в двух последовательностях, где они не совпадают.
До (предложенного) C++14 алгоритм<std::mismatch
>взяли три итератора и необязательный сравнительный предикат. Первые два итератора<[first1,last1)
>определили последовательность, а второй<first2
>определил начало второй последовательности. Предполагается, что вторая последовательность имеет ту же длину, что и первая.
В C++14 были введены два новых варианта, берущие четыре итератора и необязательный сравнительный предикат. Четыре итератора определяют две последовательности<[first1,last1)
>и<[first2,last2)
>явно, а не определяют вторую неявно. Это приводит к правильным ответам в большем количестве случаев (и избегать неопределенного поведения в других).
Рассмотрим две последовательности:
auto seq1 = { 0, 1, 2 };
auto seq2 = { 0, 1, 2, 3, 4 };
std::mismatch ( seq1.begin (), seq1.end (), seq2.begin ());
std::mismatch ( seq2.begin (), seq2.end (), seq1.begin ());
std::mismatch ( seq1.begin (), seq1.end (), seq2.begin (), seq2.end ());
Первые N в<seq2
>те же, что и в<seq1
>, но это не все, что в<seq2
>. Во втором случае алгоритм будет читать дальше конца<seq1
>, что приведет к неопределенному поведению (большое землетрясение, неправильные результаты, беременная кошка и т. д.).
Однако, если две последовательности указаны полностью, ясно, что где происходит несоответствие.
Функция<mismatch
>возвращает пару итераторов, которые обозначают первые несоответствующие элементы в каждой последовательности. Если последовательности совпадают полностью,<mismatch
>возвращает их конечные итераторы. Одна версия использует<std::equal_to
>для сравнения; другая позволяет абоненту передать предикат для сравнения.
template <class InputIterator1, class InputIterator2>
std::pair<InputIterator1, InputIterator2>
mismatch ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2 );
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
std::pair<InputIterator1, InputIterator2>
mismatch ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, BinaryPredicate pred );
<c1
>, содержащее<{0,1,
2,3,14,15}
>, и<c2
>содержащее<{1,
2,3}
>, то
mismatch ( c1.begin(), c1.end(), c2.begin(), c2.end()) --> <c1.begin(), c2.begin()>
mismatch ( c1.begin() + 1, c1.begin() + 4, c2.begin(), c2.end()) --> <c1.begin() + 4, c2.end ()>
mismatch ( c1.end(), c1.end(), c2.end(), c2.end()) --> <c1.end(), c2.end()>
<mismatch
>работает на всех итераторах, кроме выходных итераторов.
Оба варианта<mismatch
>работают вO(N)(линейное) время; то есть они сравниваются с каждым элементом в списке один раз. Если последовательность не будет найдена равной в какой-либо точке, рутина прекратится немедленно, без изучения остальных элементов.
Оба варианта<mismatch
>берут свои параметры по стоимости и не зависят ни от какого глобального государства. Таким образом, все процедуры в этом файле обеспечивают сильную гарантию исключения.
- Если последовательности равны (или обе пусты), то несоответствие возвращает конечные итераторы обеих последовательностей.
- Четыре итератора версии рутины<
mismatch
>является частью стандарта C++14. Когда стандартные библиотеки C++14 становятся доступными, следует использовать реализацию из стандартной библиотеки.