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

std::mismatch

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
all_of
any_of
none_of
(C++11)
(C++11)
(C++11)
for_each
count
count_if
mismatch
equal
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека 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

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

Определяет, одинаковы ли два множества элементов
(шаблон функции) [edit]
Находит первый элемент, удовлетворяющий определенным критериям
(шаблон функции) [edit]
возвращает истину, если один диапазон лексикографически меньше, чем другой
Оригинал:
returns true if one range is lexicographically less than another
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]
Ищет первое вхождение последовательности элементов в диапазон
(шаблон функции) [edit]