Namespaces
Variants

std::ranges::mismatch, std::ranges::mismatch_result

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

Сортировка и связанные операции
Операции разделения
(C++11)    

Операции сортировки
Операции бинарного поиска
(на разбитых диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции над кучей
Операции поиска минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения (C++17)
(только для пояснения*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имён std::ranges
Немодифицирующие операции последовательностей
Модифицирующие операции последовательностей
Операции разделения
Операции сортировки
Операции бинарного поиска (на отсортированных диапазонах)
       
       
Операции над множествами (на отсортированных диапазонах)
Операции над кучей
Операции поиска минимума/максимума
       
       
Операции перестановок
Операции свёртки
Операции над неинициализированной памятью
Возвращаемые типы
 
Определён в заголовочном файле <algorithm>
Сигнатура вызова
template< std::input_iterator I1, std::sentinel_for<I1> S1,
          std::input_iterator I2, std::sentinel_for<I2> S2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
constexpr mismatch_result<I1, I2>
    mismatch( I1 first1, S1 last1, I2 first2, S2 last2,
              Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {} );
(1) (начиная с C++20)
template< ranges::input_range R1, ranges::input_range R2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires std::indirectly_comparable<
             ranges::iterator_t<R1>, ranges::iterator_t<R2>, Pred, Proj1, Proj2>
constexpr mismatch_result<ranges::borrowed_iterator_t<R1>,
                          ranges::borrowed_iterator_t<R2>>
    mismatch( R1&& r1, R2&& r2, Pred pred = {},
              Proj1 proj1 = {}, Proj2 proj2 = {} );
(2) (начиная с C++20)
Вспомогательные типы
template< class I1, class I2 >
using mismatch_result = ranges::in_in_result<I1, I2>;
(3) (начиная с C++20)

Возвращает первую несовпадающую пару спроецированных элементов из двух диапазонов: одного, заданного с помощью [first1, last1) или r1, и другого, заданного с помощью [first2, last2) или r2.

1) Элементы сравниваются с помощью заданного бинарного предиката p.
2) То же, что и (1), но в качестве исходного диапазона используется r, как если бы ranges::begin(r) использовалось как first, а ranges::end(r) — как last.

Описанные на этой странице сущности, подобные функциям, являются объектами-функциями алгоритмов (неформально известными как niebloids), то есть:

Параметры

first1, last1 - пара итератор-страж, определяющая первый диапазон элементов для сравнения
r1 - первый диапазон элементов для сравнения
first2, last2 - пара итератор-страж, определяющая второй диапазон элементов для сравнения
r2 - второй диапазон элементов для сравнения
pred - предикат, применяемый к проецируемым элементам
proj1 - проекция, применяемая к первому диапазону элементов
proj2 - проекция, применяемая ко второму диапазону элементов

Возвращаемое значение

ranges::mismatch_result с итераторами на первые два неравных элемента.

Если при сравнении не обнаружено несоответствий до достижения last1 или last2 (в зависимости от того, что наступит раньше), объект содержит конечный итератор и соответствующий итератор из другого диапазона.

Сложность

Не более std:: min ( last1 - first1, last2 - first2 ) применений предиката и соответствующих проекций.

Возможная реализация

struct mismatch_fn
{
    template<std::input_iterator I1, std::sentinel_for<I1> S1,
             std::input_iterator I2, std::sentinel_for<I2> S2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
    constexpr std::mismatch_result<I1, I2>
        operator()(I1 first1, S1 last1, I2 first2, S2 last2,
                   Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        for (; first1 != last1 && first2 != last2; ++first1, (void)++first2)
            if (not std::invoke(pred, std::invoke(proj1, *first1),
                                      std::invoke(proj2, *first2)))
                break;
        return {first1, first2};
    }
    template<ranges::input_range R1, ranges::input_range R2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::indirectly_comparable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
    constexpr ranges::mismatch_result<ranges::borrowed_iterator_t<R1>,
                                      ranges::borrowed_iterator_t<R2>>
        operator()(R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (*this)(ranges::begin(r1), ranges::end(r1),
                       ranges::begin(r2), ranges::end(r2),
                       std::ref(pred), std::ref(proj1), std::ref(proj2));
    }
};
inline constexpr mismatch_fn mismatch;

Пример

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

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
[[nodiscard]]
constexpr std::string_view mirror_ends(const std::string_view in)
{
    const auto end = std::ranges::mismatch(in, in | std::views::reverse).in1;
    return {in.cbegin(), end};
}
int main()
{
    std::cout << mirror_ends("abXYZba") << '\n'
              << mirror_ends("abca") << '\n'
              << mirror_ends("ABBA") << '\n'
              << mirror_ends("level") << '\n';
    using namespace std::literals::string_view_literals;
    static_assert("123"sv == mirror_ends("123!@#321"));
    static_assert("radar"sv == mirror_ends("radar"));
}

Вывод:

ab
a
ABBA
level

См. также

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