funciones<ranges>
El encabezado <ranges>
C++20 incluye las siguientes funciones auxiliares no miembro.
Funciones no miembro | Descripción |
---|---|
begin C++20 |
Obtiene un iterador al primer elemento del rango. |
cbegin C++20 |
Obtiene un iterador const al primer elemento del rango. |
cend C++20 |
Obtiene el centinela que se encuentra al final del rango calificado por const . |
cdata C++20 |
Obtiene un puntero const al primer elemento del rango contiguo. |
crbegin C++20 |
Obtiene un iterador inverso const al principio del rango. |
crend C++20 |
Obtiene el centinela que se encuentra al final de lo que crbegin() devuelve. |
data C++20 |
Obtiene un puntero al primer elemento del rango contiguo. |
empty C++20 |
Pruebe si el intervalo está vacío. |
end C++20 |
Obtiene el centinela que se encuentra al final del rango. |
rbegin C++20 |
Obtiene un iterador inverso al principio del rango. |
rend C++20 |
Obtiene un iterador inverso al centinela que se encuentra al final del rango. |
size C++20 |
Obtiene el tamaño del rango como un valor sin signo. |
ssize C++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:
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:
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
:
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:
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:
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:
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:
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:
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
}