Namespaces
Variants

std::ranges:: contains, std::ranges:: contains_subrange

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
(1)
template < std:: input_iterator I, std:: sentinel_for < I > S,

class T,
class Proj = std:: identity >
requires std:: indirect_binary_predicate
< ranges:: equal_to , std :: projected < I, Proj > , const T * >

constexpr bool contains ( I first, S last, const T & value, Proj proj = { } ) ;
(desde C++23)
(hasta C++26)
template < std:: input_iterator I, std:: sentinel_for < I > S,

class Proj = std:: identity ,
class T = std :: projected_value_t < I, Proj > >
requires std:: indirect_binary_predicate
< ranges:: equal_to , std :: projected < I, Proj > , const T * >

constexpr bool contains ( I first, S last, const T & value, Proj proj = { } ) ;
(desde C++26)
(2)
template < ranges:: input_range R,

class T,
class Proj = std:: identity >
requires std:: indirect_binary_predicate
< ranges:: equal_to ,
std :: projected < ranges:: iterator_t < R > , Proj > , const T * >

constexpr bool contains ( R && r, const T & value, Proj proj = { } ) ;
(desde C++23)
(hasta C++26)
template < ranges:: input_range R,

class Proj = std:: identity ,
class T = std :: projected_value_t < ranges:: iterator_t < R > , Proj > >
requires std:: indirect_binary_predicate
< ranges:: equal_to ,
std :: projected < ranges:: iterator_t < R > , Proj > , const T * >

constexpr bool contains ( R && r, const T & value, Proj proj = { } ) ;
(desde C++26)
template < std:: forward_iterator I1, std:: sentinel_for < I1 > S1,

std:: forward_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 bool contains_subrange ( I1 first1, S1 last1, I2 first2, S2 last2,
Pred pred = { } ,

Proj1 proj1 = { } , Proj2 proj2 = { } ) ;
(3) (desde C++23)
template < ranges:: forward_range R1, ranges:: forward_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 bool contains_subrange ( R1 && r1, R2 && r2, Pred pred = { } ,

Proj1 proj1 = { } , Proj2 proj2 = { } ) ;
(4) (desde C++23)
1,2) Comprueba si un rango dado contiene el valor value .
1) El rango fuente es [ first , last ) .
2) El rango fuente es [ ranges:: begin ( r ) , ranges:: end ( r ) ) .
3) Comprueba si un rango dado es un subrango de otro rango.
3) El primer rango de origen es [ first1 , last1 ) , y el segundo rango de origen es [ first2 , last2 ) .
4) El primer rango de origen es [ ranges:: begin ( r1 ) , ranges:: end ( r1 ) ) , y el segundo rango de origen es [ ranges:: begin ( r2 ) , ranges:: end ( r2 ) ) .

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

Contenidos

Parámetros

first, last - el par iterador-centinela que define el rango de elementos a examinar
r - el rango de los elementos a examinar
value - valor contra el cual comparar los elementos
pred - predicado a aplicar a los elementos proyectados
proj - proyección a aplicar a los elementos

Valor de retorno

1) ranges:: find ( std :: move ( first ) , last, value, proj ) ! = last
2) ranges:: find ( std :: move ( ranges:: begin ( r ) ) , ranges:: end ( r ) , valor, proj ) ! = ranges:: end ( r )
3) first2 == last2 || ! ranges:: search ( first1, last1, first2, last2, pred, proj1, proj2 ) . empty ( )
4) ranges:: begin ( r2 ) == ranges:: end ( r2 ) ||
! ranges:: search ( ranges:: begin ( r1 ) , ranges:: end ( r1 ) ,
ranges:: begin ( r2 ) , ranges:: end ( r2 ) , pred, proj1, proj2 ) . empty ( )

Complejidad

1) Como máximo ranges:: distance ( first, last ) comparaciones.
2) Como máximo ranges:: distance ( r ) comparaciones.
3) Como máximo ranges:: distance ( first1, last1 ) * ranges:: distance ( first2, last2 ) comparaciones.
4) Como máximo ranges:: distance ( r1 ) * ranges:: distance ( r2 ) comparaciones.

Notas

En C++20, uno puede implementar una función contains con ranges:: find ( haystack, needle ) ! = ranges:: end ( haystack ) o contains_subrange con ! ranges:: search ( haystack, needle ) . empty ( ) .

ranges::contains_subrange , al igual que ranges::search , y a diferencia de std::search , no tiene soporte para searchers (como std::boyer_moore_searcher ).

Macro de prueba de características Valor Estándar Característica
__cpp_lib_ranges_contains 202207L (C++23) ranges::contains y ranges::contains_subrange
__cpp_lib_algorithm_default_value_type 202403L (C++26) Inicialización de lista para algoritmos ( 1,2 )

Implementación posible

contiene (1,2)
struct __contains_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S,
             class Proj = std::identity,
             class T = std::projected_value_t<I, Proj>>
    requires std::indirect_binary_predicate<ranges::equal_to, std::projected<I, Proj>,
                                            const T*>
    constexpr bool operator()(I first, S last, const T& value, Proj proj = {}) const
    {
        return ranges::find(std::move(first), last, value, proj) != last;
    }
    template<ranges::input_range R,
             class Proj = std::identity,
             class T = std::projected_value_t<ranges::iterator_t<R>, Proj>>
    requires std::indirect_binary_predicate<ranges::equal_to,
                                            std::projected<ranges::iterator_t<R>, Proj>,
                                            const T*>
    constexpr bool operator()(R&& r, const T& value, Proj proj = {}) const
    {
        return ranges::find(std::move(ranges::begin(r)),
                            ranges::end(r), value, proj) != ranges::end(r);
    }
};
inline constexpr __contains_fn contains{};
contains_subrange (3,4)
struct __contains_subrange_fn
{
    template<std::forward_iterator I1, std::sentinel_for<I1> S1,
             std::forward_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 bool operator()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
                              Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (first2 == last2) ||
                   !ranges::search(first1, last1, first2, last2,
                                   pred, proj1, proj2).empty();
    }
    template<ranges::forward_range R1, ranges::forward_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 bool operator()(R1&& r1, R2&& r2, Pred pred = {},
                              Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (first2 == last2) ||
                   !ranges::search(ranges::begin(r1), ranges::end(r1),
                                   ranges::begin(r2), ranges::end(r2),
                                   pred, proj1, proj2).empty();
    }
};
inline constexpr __contains_subrange_fn contains_subrange{};

Ejemplo

#include <algorithm>
#include <array>
#include <complex>
namespace ranges = std::ranges;
int main()
{
    constexpr auto haystack = std::array{3, 1, 4, 1, 5};
    constexpr auto needle = std::array{1, 4, 1};
    constexpr auto bodkin = std::array{2, 5, 2};
    static_assert
    (
        ranges::contains(haystack, 4) &&
       !ranges::contains(haystack, 6) &&
        ranges::contains_subrange(haystack, needle) &&
       !ranges::contains_subrange(haystack, bodkin)
    );
    constexpr std::array<std::complex<double>, 3> nums{{{1, 2}, {3, 4}, {5, 6}}};
    #ifdef __cpp_lib_algorithm_default_value_type
        static_assert(ranges::contains(nums, {3, 4}));
    #else
        static_assert(ranges::contains(nums, std::complex<double>{3, 4}));
    #endif
}

Véase también

encuentra el primer elemento que satisface criterios específicos
(objeto función de algoritmo)
busca la primera ocurrencia de un rango de elementos
(objeto función de algoritmo)
determina si un elemento existe en un rango parcialmente ordenado
(objeto función de algoritmo)
retorna true si una secuencia es una subsecuencia de otra
(objeto función de algoritmo)
verifica si un predicado es true para todos, alguno o ninguno de los elementos en un rango
(objeto función de algoritmo)