Namespaces
Variants

std::ranges::ends_with

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p.ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Operaciones de ordenación y relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Algoritmos restringidos
Todos los nombres en este menú pertenecen al espacio de nombres std::ranges
Operaciones de secuencia no modificadoras
Operaciones de secuencia modificadoras
Operaciones de particionado
Operaciones de ordenación
Operaciones de búsqueda binaria (en rangos particionados)
       
       
Operaciones de conjunto (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones sobre almacenamiento no inicializado
Tipos de retorno
 
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 Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires (std::forward_iterator<I1> || std::sized_sentinel_for<S1, I1>) &&
         (std::forward_iterator<I2> || std::sized_sentinel_for<S2, I2>) &&
         std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
constexpr bool ends_with( I1 first1, S1 last1,
                          I2 first2, S2 last2, Pred pred = {},
                          Proj1 proj1 = {}, Proj2 proj2 = {} );
(1) (desde C++23)
template< ranges::input_range R1, ranges::input_range R2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
requires (ranges::forward_range<R1> || ranges::sized_range<R1>) &&
         (ranges::forward_range<R2> || ranges::sized_range<R2>) &&
         std::indirectly_comparable<ranges::iterator_t<R1>,
                                    ranges::iterator_t<R2>,
                                    Pred, Proj1, Proj2>
constexpr bool ends_with( R1&& r1, R2&& r2, Pred pred = {},
                          Proj1 proj1 = {}, Proj2 proj2 = {} );
(2) (desde C++23)

Comprueba si el segundo rango coincide con el sufijo del primer rango.

1) Sea N1 igual a ranges::distance(first1, last1) y N2 igual a ranges::distance(first2, last2):
  • Si N1 < N2 es true, devuelve false.
  • En caso contrario, devuelve ranges::equal(std::move(first1) + (N1 - N2), last1,
    std::move(first2), last2, pred, proj1, proj2)
    .
2) Sea N1 igual a ranges::distance(r1) y N2 igual a ranges::distance(r2).
  • Si N1 < N2 es true, devuelve false.
  • En caso contrario, devuelve ranges::equal(views::drop(ranges::ref_view(r1),
    N1 - static_cast<decltype(N1)>(N2)),
    r2, pred, proj1, proj2)
    .

Las entidades similares a funciones descritas en esta página son objetos función de algoritmo (conocidos informalmente como niebloids), es decir:

Parámetros

first1, last1 - el par iterador-centinela que define el rango de elementos a examinar
r1 - el rango de elementos a examinar
first2, last2 - el par iterador-centinela que define el rango de elementos a usar como sufijo
r2 - el rango de elementos a usar como sufijo
pred - el predicado binario que compara los elementos proyectados
proj1 - la proyección a aplicar a los elementos del rango a examinar
proj2 - la proyección a aplicar a los elementos del rango a usar como sufijo

Valor de retorno

true si el segundo rango coincide con el sufijo del primer rango, false en caso contrario.

Complejidad

Generalmente lineal: como máximo min(N1,N2) aplicaciones del predicado y ambas proyecciones. El predicado y ambas proyecciones no se aplican si N1 < N2 es true.

Si tanto N1 como N2 se pueden calcular en tiempo constante (es decir, ambos pares de tipos iterador-centinela modelan sized_sentinel_for, o ambos tipos de rango modelan sized_range) y N1 < N2 es true, la complejidad temporal es constante.

Posible implementación

struct ends_with_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::forward_iterator<I1> || std::sized_sentinel_for<S1, I1>) &&
             (std::forward_iterator<I2> || std::sized_sentinel_for<S2, I2>) &&
             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
    {
        const auto n1 = ranges::distance(first1, last1);
        const auto n2 = ranges::distance(first2, last2);
        if (n1 < n2)
            return false;
        ranges::advance(first1, n1 - n2);
        return ranges::equal(std::move(first1), last1,
                             std::move(first2), last2,
                             pred, proj1, proj2);
    }
    
    template<ranges::input_range R1, ranges::input_range R2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires (ranges::forward_range<R1> || ranges::sized_range<R1>) &&
             (ranges::forward_range<R2> || ranges::sized_range<R2>) &&
             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
    {
        const auto n1 = ranges::distance(r1);
        const auto n2 = ranges::distance(r2);
        if (n1 < n2)
            return false;
        return ranges::equal(views::drop(ranges::ref_view(r1),
                                         n1 - static_cast<decltype(n1)>(n2)),
                             r2, pred, proj1, proj2);
    }
};

inline constexpr ends_with_fn ends_with{};

Notas

Macro de prueba de características Valor Estándar Característica
__cpp_lib_ranges_starts_ends_with 202106L (C++23) std::ranges::starts_with, std::ranges::ends_with

Ejemplo

#include <algorithm>
#include <array>

static_assert
(
    ! std::ranges::ends_with("for", "cast") &&
    std::ranges::ends_with("dynamic_cast", "cast") &&
    ! std::ranges::ends_with("as_const", "cast") &&
    std::ranges::ends_with("bit_cast", "cast") &&
    ! std::ranges::ends_with("to_underlying", "cast") &&
    std::ranges::ends_with(std::array{1, 2, 3, 4}, std::array{3, 4}) &&
    ! std::ranges::ends_with(std::array{1, 2, 3, 4}, std::array{4, 5})
);

int main() {}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a estándares C++ previamente publicados.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 4105 C++23 la sobrecarga (2) calculaba la diferencia
de tamaño por N1 - N2[1]
cambiado a
N1 - static_cast<decltype(N1)>(N2)
  1. ↑ Su resultado podría ser de un tipo de clase entera, en cuyo caso ranges::drop_view no se puede construir.

Véase también

comprueba si un rango comienza con otro rango
(objeto función de algoritmo)
(C++20)
comprueba si la cadena termina con el sufijo dado
(función miembro pública de std::basic_string<CharT,Traits,Allocator>)
(C++20)
comprueba si la vista de cadena termina con el sufijo dado
(función miembro pública de std::basic_string_view<CharT,Traits>)