std::mismatch
| Определено в заголовке <algorithm>
|
||
template< class InputIt1, class InputIt2 >
std::pair<InputIt1, InputIt2>
mismatch( InputIt1 first1, InputIt1 last1,
InputIt2 first2 );
|
(1) | (constexpr начиная с C++20) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
std::pair<ForwardIt1, ForwardIt2>
mismatch( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2 );
|
(2) | (начиная с C++17) |
template< class InputIt1, class InputIt2, class BinaryPred >
std::pair<InputIt1, InputIt2>
mismatch( InputIt1 first1, InputIt1 last1,
InputIt2 first2, BinaryPred p );
|
(3) | (constexpr начиная с C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class BinaryPred >
std::pair<ForwardIt1, ForwardIt2>
mismatch( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, BinaryPred p );
|
(4) | (начиная с C++17) |
template< class InputIt1, class InputIt2 >
std::pair<InputIt1, InputIt2>
mismatch( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2 );
|
(5) | (начиная с C++14) (constexpr начиная с C++20) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
std::pair<ForwardIt1, ForwardIt2>
mismatch( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2 );
|
(6) | (начиная с C++17) |
template< class InputIt1, class InputIt2, class BinaryPred >
std::pair<InputIt1, InputIt2>
mismatch( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2, BinaryPred p );
|
(7) | (начиная с C++14) (constexpr начиная с C++20) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class BinaryPred >
std::pair<ForwardIt1, ForwardIt2>
mismatch( ExecutionPolicy&& policy,
ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2, BinaryPred p );
|
(8) | (начиная с C++17) |
Возвращает пару итераторов на первые несовпадающие элементы из [first1, last1) и диапазона, начинающегося с first2:
- Для перегрузок (1-4), второй диапазон имеет
std::distance(first1, last1)элементов. - Для перегрузок (5-8), второй диапазон — это
[first2,last2).
- Если
std::distance(first1, last1)иstd::distance(first2, last2)различаются, сравнение останавливается при достиженииlast1илиlast2.
- Если
operator==.p.policy.true:
|
|
(до C++20) |
|
|
(начиная с C++20) |
Параметры
| first1, last1 | - | пара итераторов, определяющая первый диапазон элементов для сравнения |
| first2, last2 | - | пара итераторов, определяющая второй диапазон элементов для сравнения |
| policy | - | политика выполнения для использования |
| p | - | бинарный предикат, который возвращает true если элементы следует считать равными. Сигнатура функции предиката должна быть эквивалентна следующей:
Хотя сигнатура не обязательно должна содержать |
| Требования к типам | ||
-InputIt1 должен соответствовать требованиям LegacyInputIterator.
| ||
-InputIt2 должен соответствовать требованиям LegacyInputIterator.
| ||
-ForwardIt1 должен соответствовать требованиям LegacyForwardIterator.
| ||
-ForwardIt2 должен соответствовать требованиям LegacyForwardIterator.
| ||
-BinaryPred должен соответствовать требованиям BinaryPredicate.
| ||
Возвращаемое значение
std::pair с итераторами на первые два неравных элемента.
Если достигнут last1, второй итератор в паре — это std::distance(first1, last1)-й итератор после first2.
Для перегрузок (5-8), если достигнут last2, первый итератор в паре — это std::distance(first2, last2)-й итератор после first1.
Сложность
Пусть N1 равно std::distance(first1, last1) и N2 равно std::distance(first2, last2):
operator==.p.operator==.p.Исключения
Перегрузки с параметром шаблона с именем ExecutionPolicy сообщают об ошибках следующим образом:
- Если выполнение функции, вызванной в рамках алгоритма, вызывает исключение и
ExecutionPolicyявляется одной из стандартных политик, вызывается std::terminate. Для любого другогоExecutionPolicyповедение определяется реализацией. - Если алгоритму не удается выделить память, выбрасывается std::bad_alloc.
Возможная реализация
| mismatch (1) |
|---|
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);
}
|
| mismatch (3) |
template<class InputIt1, class InputIt2, class BinaryPred>
std::pair<InputIt1, InputIt2>
mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPred p)
{
while (first1 != last1 && p(*first1, *first2))
++first1, ++first2;
return std::make_pair(first1, first2);
}
|
| mismatch (5) |
template<class InputIt1, class InputIt2>
std::pair<InputIt1, InputIt2>
mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
{
while (first1 != last1 && first2 != last2 && *first1 == *first2)
++first1, ++first2;
return std::make_pair(first1, first2);
}
|
| mismatch (7) |
template<class InputIt1, class InputIt2, class BinaryPred>
std::pair<InputIt1, InputIt2>
mismatch(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2, BinaryPred p)
{
while (first1 != last1 && first2 != last2 && p(*first1, *first2))
++first1, ++first2;
return std::make_pair(first1, first2);
}
|
Пример
Эта программа определяет самую длинную подстроку, которая одновременно находится в самом начале заданной строки и в самом её конце, в обратном порядке (возможно, перекрываясь).
#include <algorithm>
#include <iostream>
#include <string>
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
Смотрите также
| определяет, являются ли два набора элементов одинаковыми (шаблон функции & функциональный объект алгоритма) | |
(C++20) |
|
(C++11) |
находит первый элемент, удовлетворяющий определённым критериям (шаблон функции & функциональный объект алгоритма) |
(C++20)(C++20)(C++20) |
|
| сравнивает два диапазона лексикографически (шаблон функции & функциональный объект алгоритма) | |
| ищет первое вхождение диапазона элементов (шаблон функции & функциональный объект алгоритма) | |
(C++20) |
|
(C++20) |
находит первую позицию, где два диапазона различаются (функциональный объект алгоритма) |