Compartir a través de


funciones<ranges>

El encabezado <ranges>C++20 incluye las siguientes funciones auxiliares no miembro.

Funciones no miembro Descripción
beginC++20 Obtiene un iterador al primer elemento del rango.
cbeginC++20 Obtiene un iterador const al primer elemento del rango.
cendC++20 Obtiene el centinela que se encuentra al final del rango calificado por const.
cdataC++20 Obtiene un puntero const al primer elemento del rango contiguo.
crbeginC++20 Obtiene un iterador inverso const al principio del rango.
crendC++20 Obtiene el centinela que se encuentra al final de lo que crbegin() devuelve.
dataC++20 Obtiene un puntero al primer elemento del rango contiguo.
emptyC++20 Pruebe si el intervalo está vacío.
endC++20 Obtiene el centinela que se encuentra al final del rango.
rbeginC++20 Obtiene un iterador inverso al principio del rango.
rendC++20 Obtiene un iterador inverso al centinela que se encuentra al final del rango.
sizeC++20 Obtiene el tamaño del rango como un valor sin signo.
ssizeC++20 Obtiene el tamaño del rango como un valor con signo.

Muchas de estas "funciones" se implementan como objetos de punto de personalización. Un objeto de punto de personalización es un objeto de función que se puede sobrecargar en tipos definidos por el usuario, al tiempo que se aplican restricciones en los tipos de tipos que se pueden pasar al objeto de función. El efecto final es que el compilador determina si hay una función personalizada válida a la que llamar para el tipo pasado, si se debe usar la implementación predeterminada o si la llamada tiene un formato incorrecto.

Muchas de estas funciones tienen funciones correspondientes en el espacio de nombres std. Pero al trabajar con rangos, use estas funciones auxiliares en su lugar. Estas funciones usan conceptos de C++20, que proporcionan mejores errores en tiempo de compilación. Dado que se implementan como puntos de personalización, se evitan los problemas relacionados con la búsqueda dependiente de argumentos (ADL) y la corrección de const.

begin

Obtiene un iterador al primer elemento del rango.

template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

Un iterador al primer elemento del rango:

Imagen de un vector con los elementos 10, 20 y 30. El primer elemento contiene 10 y se ha etiquetado como 'begin()'. El último elemento contiene 30 y se ha etiquetado como 'last element'. Un cuadro imaginario después del último elemento indica el centinela y se ha etiquetado como end().

Si el rango es una matriz, devuelve el equivalente de rg + 0. Si auto(rg.begin()) produce un iterador, devuelve el equivalente de auto(rg.begin()). Si esa expresión tiene un formato incorrecto, se usa auto(begin(rg)) si además produce un iterador.

Comentarios

ranges::begin() funciona en todos los rangos, mientras que std::begin() puede que no.

Ejemplo: begin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto vi = std::ranges::begin(v);
    std::cout << *vi << ' ' << *++vi; // outputs 10 20
}

cbegin

Obtiene un iterador const al primer elemento de un rango. El iterador puede acceder a los elementos del rango, pero no modificarlos.

template<class T>
constexpr std::input_or_output_iterator auto cbegin(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

Un iterador const al primer elemento del rango:

Imagen de un vector con los elementos 10, 20 y 30. El primer elemento contiene 10 y se ha etiquetado como 'cbegin()'. El último elemento contiene 30 y se ha etiquetado como 'last element'. Un cuadro imaginario después del último elemento indica el centinela y se ha etiquetado como cend().

Si el rango es una matriz, devuelve el equivalente de rg + 0. Si auto(rg.cbegin()) produce un iterador, devuelve el equivalente de auto(rg.cbegin()). Si esa expresión tiene un formato incorrecto, se usa auto(cbegin(rg)) si además produce un iterador.

Comentarios

ranges::cbegin() funciona en todos los rangos, mientras que std::cbegin() puede que no.

Ejemplo: cbegin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto vi = std::ranges::cbegin(v);
    std::cout << *vi; // outputs 10
    // *vi = 100; // error because the iterator is const
}

cdata

Obtiene un puntero const al primer elemento del rango contiguo.

template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<const T>> cdata(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

Un puntero const, basado en el tipo del rango, al primer elemento del rango contiguo. Por ejemplo, si el rango es un vector de enteros, el tipo del valor devuelto es const int *.

Ejemplo: cdata

#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    std::string src{ "a string" };
   
    auto c_charPtr = std::ranges::cdata(src); // ptr is a const char *
    auto c_intPtr = std::ranges::cdata(v); // ptr2 is a const int *
    std::cout << c_charPtr << ", " << *c_intPtr << '\n'; // outputs a string, 10

    // *c_intPtr = 100; // error - cannot assign to a const pointer
    // *charPtr = 'A'; // error - cannot assign to a const pointer
}

cend

Obtiene el centinela que se encuentra al final del rango calificado por const. El iterador puede acceder a los elementos del rango, pero no modificarlos.

template<class T>
constexpr std::sentinel_for<decltype(ranges::cbegin(std::declval<T>()))> auto cend(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

El centinela que sigue al último elemento del rango calificado por const:

Imagen de un vector con los elementos 10, 20 y 30. El primer elemento contiene 10 y se ha etiquetado como cbegin(). El último elemento contiene 30 y se ha etiquetado como 'last element'. Un cuadro imaginario después del último elemento indica el centinela y se ha etiquetado como cend().

Comentarios

ranges::cend() funciona en todos los rangos, mientras que std::cend() puede que no.

Ejemplo: cend

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto i = std::ranges::cend(v);
    --i; // get off the sentinel and onto the last element in the range
    std::cout << *i; // outputs 30
    // *i = 300 // error because the iterator is const
}

crbegin

Obtiene un iterador const inverso al primer elemento de un rango inverso. Un iterador inverso devuelve los elementos del rango en orden inverso. El rango en sí no se invierte; sí el acceso a él.

template<class T>
constexpr std::input_or_output_iterator auto crbegin(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

Un iterador const inverso al primer elemento del rango. Este iterador devuelve los elementos del rango en orden inverso, a partir del final del rango:

Imagen de un vector que contiene los elementos 10, 20 y 30. Hay un cuadro imaginario antes del elemento situado más a la izquierda (contiene el número 10) que representa al centinela. Está etiquetado como crend(). El primer elemento del vector contiene el número 10 y está etiquetado como 'last element'. El elemento situado más a la derecha del vector contiene 30 y está etiquetado como crbegin().

Si el rango es una matriz, devuelve el equivalente de reverse_iterator{rg + n}, donde n es el número de elementos de la matriz. Si auto(rg.crbegin()) produce un iterador, devuelve el equivalente de auto(rg.crbegin()). Si esa expresión tiene un formato incorrecto, se usa auto(crbegin(rg)) si además produce un iterador.

Comentarios

ranges::crbegin() funciona en todos los rangos bidireccionales, mientras que std::crbegin() puede que no.

Ejemplo: crbegin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::crbegin(v);
    std::cout << *vi << ' ' << *++vi << ' ' << *++vi; // outputs 30 20 10
    // vi[1] = 100; // error because the iterator is const
}

crend

Obtiene el centinela que se encuentra al final de lo que crbegin() devuelve. Un iterador inverso devuelve los elementos del rango en orden inverso. El rango en sí no se invierte; sí el acceso a él.

template<class T>
std::sentinel_for<decltype(ranges::crbegin(declval<T>()))> auto crend(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

El centinela que se encuentra al final de lo que cbegin() devuelve. El centinela sigue al último elemento de una vista inversa del rango:

Imagen de un vector que contiene los elementos 10, 20 y 30. Hay un cuadro imaginario antes del elemento situado más a la izquierda (contiene el número 10) que representa al centinela. Está etiquetado como crend(). El primer elemento del vector contiene el número 10 y está etiquetado como 'last element'. El elemento situado más a la derecha del vector contiene 30 y está etiquetado como crbegin().

Comentarios

ranges::crend() funciona en todos los rangos bidireccionales, mientras que std::crend() puede que no.

Ejemplo de crend

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::crend(v);
    --vi; // get off the sentinel and onto the last element in the reversed range
    std::cout << *vi; // outputs 10
    // vi[0] = 300; // error because the iterator is const    
    std::cout << *vi << ' ' << *--vi << ' ' << *--vi; // outputs 10, 20, 30
}

data

Obtiene un puntero al primer elemento de un rango contiguo.

template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<T>> data(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

Un puntero, basado en el tipo del rango, al primer elemento del rango contiguo. Por ejemplo, si el rango es un vector de enteros, el tipo del valor devuelto es int *.

Ejemplo

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    std::string src{ "a string" };
   
    auto charPtr = std::ranges::data(src); // charPtr is a char *
    auto intPtr = std::ranges::data(v); // intPtr is an int *
    std::cout << charPtr << ", " << *intPtr << '\n'; // outputs a string, 10
    *intPtr = 100;
    *charPtr = 'A';
    std::cout << charPtr << ", " << *intPtr; // outputs A string, 100
}

empty

Pruebe si el intervalo está vacío.

template<class T>
constexpr bool empty(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

Devuelve true si el intervalo no tiene elementos; en caso contrario false, .

Ejemplo

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
        std::vector v{10,20,30};
    std::vector<int> v2;

    std::cout << std::boolalpha << std::ranges::empty(v); // outputs false
    std::cout << std::boolalpha << ", " << std::ranges::empty(v2); // outputs true
}

end

Obtiene el centinela que se encuentra al final del rango.

template<class T>
std::sentinel_for<ranges::iterator_t<T>> auto end(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

El centinela que sigue al último elemento del rango:

Imagen de un vector con los elementos 10, 20 y 30. El primer elemento contiene 10 y se etiqueta begin(). El último elemento contiene 30 y se etiqueta como

Comentarios

ranges::end() funciona en todos los rangos, mientras que std::end() puede que no.

Ejemplo

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto i = std::ranges::end(v);
    --i; // get off the sentinel and onto the last element in the range
    std::cout << *i; // outputs 30
}

rbegin

Obtiene un iterador inverso al primer elemento de un rango inverso. Un iterador inverso devuelve los elementos del rango en orden inverso. El rango en sí no se invierte; sí el acceso a él.

template<class T>
constexpr std::input_or_output_iterator auto rbegin(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

Un iterador inverso al primer elemento del rango. Este iterador devuelve los elementos del rango en orden inverso, a partir del final del rango inverso:

Imagen de un vector que contiene los elementos 10, 20 y 30. Hay un cuadro imaginario antes del elemento situado más a la izquierda (contiene el número 10) que representa al centinela. Está etiquetado como rend(). El primer elemento del vector contiene el número 10 y está etiquetado como 'last element'. El elemento situado más a la derecha del vector contiene 30 y está etiquetado como rbegin().

Si el rango es una matriz, devuelve el equivalente de reverse_iterator{rg + n}, donde n es el número de elementos de la matriz. Si auto(rg.rbegin()) produce un iterador, devuelve el equivalente de auto(rg.rbegin()). Si esa expresión tiene un formato incorrecto, se usa auto(rbegin(rg)) si además produce un iterador.

Comentarios

ranges::rbegin() funciona en todos los rangos bidireccionales, mientras que std::rbegin() puede que no.

Ejemplo

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::rbegin(v);
    std::cout << *vi << ' ' << *++vi << ' ' << *++vi; // outputs 30 20 10
}

rend

Obtiene un iterador inverso al centinela que se encuentra al final de una vista inversa del rango. Un iterador inverso devuelve los elementos del rango en orden inverso. El rango en sí no se invierte; sí el acceso a él.

template<class T>
constexpr 
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> auto rend(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

Un iterador inverso al centinela que se encuentra al final del rango. El centinela sigue al último elemento de una vista inversa del rango:

Imagen de un vector que contiene los elementos 10, 20 y 30. Hay un cuadro imaginario antes del elemento situado más a la izquierda (contiene el número 10) que representa al centinela. Está etiquetado como rend(). El primer elemento del vector contiene el número 10 y está etiquetado como 'last element'. El elemento situado más a la derecha del vector contiene 30 y está etiquetado como rbegin().

Comentarios

ranges::rend() funciona en todos los rangos bidireccionales, mientras que std::rend() puede que no.

Ejemplo

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::rend(v);
    --vi; // get off the sentinel and onto the last element in the reversed range
    std::cout << *vi; // outputs 10
    std::cout << *vi << ' ' << *--vi << ' ' << *--vi; // outputs 10, 20, 30
}

size

Obtiene el número de elementos del rango como un valor sin signo.

template<class T>
constexpr /*unsigned integer-like type */ size(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

El número de elementos del rango como un valor similar a un entero sin signo.

Comentarios

Esta función se ejecuta en tiempo constante.

Ejemplo

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto s = std::ranges::size(v); // s is a size_t
    std::cout << s; // outputs 3
}

ssize

Obtiene el tamaño del rango como un valor con signo.

template<class T>
constexpr /* signed-integer-like type */ ssize(T&& rg);

Parámetros

T
Tipo del rango.

rg
Un rango.

Valor devuelto

El número de elementos del rango como un valor similar a un entero con signo.

Comentarios

Esta función se ejecuta en tiempo constante.

Ejemplo

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto s = std::ranges::ssize(v);
    std::cout << s; // outputs 3
}

Vea también

<ranges>
¿Qué son los objetos de personalización?