Namespaces
Variants

std::ranges::includes

С 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 Proj1 = std::identity, class Proj2 = std::identity,
          std::indirect_strict_weak_order<
              std::projected<I1, Proj1>,
              std::projected<I2, Proj2>> Comp = ranges::less >
constexpr bool
    includes( I1 first1, S1 last1, I2 first2, S2 last2,
              Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {} )
(1) (начиная с C++20)
template< ranges::input_range R1, ranges::input_range R2,
          class Proj1 = std::identity, class Proj2 = std::identity,
          std::indirect_strict_weak_order<
              std::projected<ranges::iterator_t<R1>, Proj1>,
              std::projected<ranges::iterator_t<R2>, Proj2>> Comp = ranges::less >
constexpr bool
    includes( R1&& r1, R2&& r2, Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {} )
(2) (начиная с C++20)
1) Возвращает true, если проекции отсортированного диапазона [first2, last2) является подпоследовательностью проекций отсортированного диапазона [first1, last1).
2) То же, что и (1), но использует r1 и r2 в качестве исходных диапазонов, как если бы использовались ranges::begin(r1) и ranges::begin(r2) в качестве first1 и first2 соответственно, и ranges::end(r1) и ranges::end(r2) в качестве last1 и last2 соответственно.

Оба диапазона должны быть отсортированы с заданной функцией сравнения comp. Подпоследовательность не обязательно должна быть непрерывной.

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

Параметры

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

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

true если [ first2 , last2 ) является подпоследовательностью [ first1 , last1 ) ; иначе false .

Сложность

Не более 2·(N 1 +N 2 -1) сравнений, где N 1 равно ranges:: distance ( r1 ) , а N 2 равно ranges:: distance ( r2 ) .

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

struct includes_fn
{
    template<std::input_iterator I1, std::sentinel_for<I1> S1,
             std::input_iterator I2, std::sentinel_for<I2> S2,
             class Proj1 = std::identity, class Proj2 = std::identity,
             std::indirect_strict_weak_order<
                 std::projected<I1, Proj1>,
                 std::projected<I2, Proj2>> Comp = ranges::less>
    constexpr bool operator()(I1 first1, S1 last1, I2 first2, S2 last2,
                              Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        for (; first2 != last2; ++first1)
        {
            if (first1 == last1 || comp(*first2, *first1))
                return false;
            if (!comp(*first1, *first2))
                ++first2;
        }
        return true;
    }
    template<ranges::input_range R1, ranges::input_range R2,
             class Proj1 = std::identity, class Proj2 = std::identity,
             std::indirect_strict_weak_order<
                 std::projected<ranges::iterator_t<R1>, Proj1>,
                 std::projected<ranges::iterator_t<R2>, Proj2>> Comp = ranges::less>
    constexpr bool operator()(R1&& r1, R2&& r2, Comp comp = {},
                              Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (*this)(ranges::begin(r1), ranges::end(r1),
                       ranges::begin(r2), ranges::end(r2),
                       std::ref(comp), std::ref(proj1), std::ref(proj2));
    }
};
inline constexpr auto includes = includes_fn {};

Пример

#include <algorithm>
#include <cctype>
#include <initializer_list>
#include <iomanip>
#include <iostream>
#include <locale>
#include <string>
template<class T>
std::ostream& operator<<(std::ostream& os, std::initializer_list<T> const& list)
{
    for (os << "{ "; auto const& elem : list)
        os << elem << ' ';
    return os << "} ";
}
struct true_false : std::numpunct<char>
{
    std::string do_truename() const { return "? Yes\n"; }
    std::string do_falsename() const { return "? No\n"; }
};
int main()
{
    std::cout.imbue(std::locale(std::cout.getloc(), new true_false));
    auto ignore_case = [](char a, char b) { return std::tolower(a) < std::tolower(b); };
    const auto
        a = {'a', 'b', 'c'},
        b = {'a', 'c'},
        c = {'a', 'a', 'b'},
        d = {'g'},
        e = {'a', 'c', 'g'},
        f = {'A', 'B', 'C'},
        z = {'a', 'b', 'c', 'f', 'h', 'x'};
    std::cout
        << z << "includes\n" << std::boolalpha
        << a << std::ranges::includes(z.begin(), z.end(), a.begin(), a.end())
        << b << std::ranges::includes(z, b)
        << c << std::ranges::includes(z, c)
        << d << std::ranges::includes(z, d)
        << e << std::ranges::includes(z, e)
        << f << std::ranges::includes(z, f, ignore_case);
}

Вывод:

{ a b c f h x } includes
{ a b c } ? Yes
{ a c } ? Yes
{ a a b } ? No
{ g } ? No
{ a c g } ? No
{ A B C } ? Yes

Смотрите также

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