Пространства имён
Варианты
Действия

std::mismatch

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 
Определено в заголовочном файле <algorithm>
template< class InputIt1, class InputIt2 >

std::pair<InputIt1,InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2 );
(1)
template< class InputIt1, class InputIt2, class BinaryPredicate >

std::pair<InputIt1,InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,
              InputIt2 first2,

              BinaryPredicate p );
(2)
template< class InputIt1, class InputIt2 >

std::pair<InputIt1,InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,

              InputIt2 first2, InputIt2 last2 );
(3) (начиная с C++14)
template< class InputIt1, class InputIt2, class BinaryPredicate >

std::pair<InputIt1,InputIt2>
    mismatch( InputIt1 first1, InputIt1 last1,
              InputIt2 first2, InputIt2 last2,

              BinaryPredicate p );
(4) (начиная с C++14)

Возвращает первую пару несовпадающих элементов из двух диапазонов: одного, определяемого [first1, last1), и другого, начинающегося с first2. Если итератор last2 не указан (перегрузки (1) и (2)), он полагается равным first2 + (last1 - first1).

Перегрузки (1) и (3) используют operator== для сравнения элементов, перегрузки (2) и (4) используют заданный бинарный предикат p.

Содержание

[править] Параметры

first1, last1 первый диапазон элементов
first2, last2 второй диапазон элементов
p бинарный предикат, который возвращает ​true если элементы следует считать равными.

Определение функции предиката должно быть эквивалентно следующему:

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

Определение не должно обязательно содержать const &, но функция не должна модифицировать принимаемые объекты.
Типы Type1 и Type2 должны быть таковы, что объекты типов InputIt1 и InputIt2 могут быть разыменованы и затем неявно преобразованы в Type1 и Type2 соответственно.

Требования к типам
-
InputIt1 должен соответствовать требованиям InputIterator.
-
InputIt2 должен соответствовать требованиям InputIterator.
-
BinaryPredicate должен соответствовать требованиям BinaryPredicate.

[править] Возвращаемое значение

std::pair с итераторами на первые два неэквивалентных элемента.

Если ни одного несовпадения до last1 не найдено, в паре возвращаются last1 и соответствующий итератор из второго диапазона. Поведение не определено, если второй диапазон короче первого диапазона. (до C++14)
Если ни одного несовпадения до last1 и last2 не найдено, в паре возвращаются первый встретившийся конечный итератор и соответствующий ему итератор из другого диапазона. (начиная с C++14)

[править] Сложность

Не больше last1 - first1 применений предиката.

[править] Возможная реализация

Первый вариант
template<class InputIt1, class InputIt2>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2)
{
    while (first1 != last1 && *first1 == *first2) {
        ++first1, ++first2;
    }
    return std::make_pair(first1, first2);
}
Второй вариант
template<class InputIt1, class InputIt2, class BinaryPredicate>
std::pair<InputIt1, InputIt2>
    mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p)
{
    while (first1 != last1 && p(*first1, *first2)) {
        ++first1, ++first2;
    }
    return std::make_pair(first1, first2);
}

[править] Пример

Эта программа определяет самую длинную подстроку, которая одновременно является началом заданной строки и её концом в обратном порядке (возможно, пересекающимися).

#include <iostream>
#include <string>
#include <algorithm>
 
std::string mirror_ends(const std::string& in)
{
    return std::string(in.begin(),
                       std::mismatch(in.begin(), in.end(), in.rbegin()).first);
}
 
int main()
{
    std::cout << mirror_ends("abXYZba") << '\n'
              << mirror_ends("abca") << '\n'
              << mirror_ends("aba") << '\n';
}

Вывод:

ab
a
aba

[править] См. также

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