Namespaces
Variants

std::ranges:: includes

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
Definido en el encabezado <algorithm>
Firma de llamada
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) (desde 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) (desde C++20)
1) Devuelve true si las proyecciones del rango ordenado [ first2 , last2 ) son una subsecuencia de las proyecciones del rango ordenado [ first1 , last1 ) .
2) Igual que (1) , pero utiliza r1 y r2 como los rangos fuente, como si se usaran ranges:: begin ( r1 ) y ranges:: begin ( r2 ) como first1 y first2 respectivamente, y ranges:: end ( r1 ) y ranges:: end ( r2 ) como last1 y last2 respectivamente.

Ambos rangos deben estar ordenados con la función de comparación dada comp . Una subsecuencia no necesita ser contigua.

Las entidades similares a funciones descritas en esta página son algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

Parámetros

first1, last1 - el par iterador-centinela que define el rango ordenado de elementos a examinar
r1 - el rango ordenado de elementos a examinar
first2, last2 - el par iterador-centinela que define el rango ordenado de elementos a buscar
r2 - el rango ordenado de elementos a buscar
comp - función de comparación a aplicar a los elementos proyectados
proj1 - proyección a aplicar a los elementos en el primer rango
proj2 - proyección a aplicar a los elementos en el segundo rango

Valor de retorno

true si [ first2 , last2 ) es una subsecuencia de [ first1 , last1 ) ; de lo contrario false .

Complejidad

Como máximo 2·(N 1 +N 2 -1) comparaciones, donde N 1 es ranges:: distance ( r1 ) y N 2 es ranges:: distance ( r2 ) .

Implementación posible

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 {};

Ejemplo

#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);
}

Salida:

{ 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

Véase también

calcula la diferencia entre dos conjuntos
(objeto función de algoritmo)
busca la primera ocurrencia de un rango de elementos
(objeto función de algoritmo)
verifica si el rango contiene el elemento o subrango dado
(objeto función de algoritmo)
devuelve true si una secuencia es subsecuencia de otra
(plantilla de función)