Namespaces
Variants

std::ranges:: size

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
Definido en el encabezado <iterator>
inline namespace /* no especificado */ {

inline constexpr auto size = /* no especificado */ ;

}
(desde C++20)
(objeto de punto de personalización)
Firma de llamada
template < class T >

requires /* ver más abajo */

constexpr auto size ( T && t ) ;
(desde C++20)

Calcula el número de elementos en t en tiempo constante.

Dada la subexpresión de la cual t denota el objeto resultado (posiblemente materializado ) como E , y el tipo de E como T :

Los casos incorrectos diagnosticables anteriores resultan en fallo de sustitución cuando ranges :: size ( E ) aparece en el contexto inmediato de una instanciación de plantilla.

Contenidos

Objetos de punto de personalización

El nombre ranges::size denota un objeto de punto de personalización , que es un objeto función constante de un tipo de clase literal semiregular . Consulte CustomizationPointObject para más detalles.

Notas

Siempre que ranges :: size ( e ) sea válido para una expresión e , el tipo de retorno es integer-like .

El estándar C++20 requiere que si la llamada subyacente a la función size devuelve un prvalue, el valor de retorno se construye por movimiento desde el objeto temporal materializado. Todas las implementaciones devuelven directamente el prvalue en su lugar. El requisito se corrige mediante la propuesta posterior a C++20 P0849R8 para coincidir con las implementaciones.

La expresión ranges:: distance ( e ) también puede utilizarse para determinar el tamaño de un rango e . A diferencia de ranges :: size ( e ) , ranges:: distance ( e ) funciona incluso si e es un rango sin tamaño definido, al costo de tener complejidad lineal en ese caso.

Ejemplo

#include <iostream>
#include <ranges>
#include <type_traits>
#include <vector>
int main()
{
    auto v = std::vector<int>{};
    std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n';
    auto il = {7};     // std::initializer_list
    std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n';
    int array[]{4, 5}; // array has a known bound
    std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n';
    static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false);
}

Salida:

ranges::size(v) == 0
ranges::size(il) == 1
ranges::size(array) == 2

Informes de defectos

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

DR Aplicado a Comportamiento publicado Comportamiento correcto
P2602R2 C++20 existe maquinaria para prohibir ciertos size no miembro encontrados mediante ADL se eliminó dicha maquinaria

Véase también

devuelve un entero con signo igual al tamaño de un rango
(objeto de punto de personalización)
especifica que un rango conoce su tamaño en tiempo constante
(concepto)
devuelve la distancia entre un iterador y un centinela, o entre el inicio y fin de un rango
(objeto función algoritmo)
(C++17) (C++20)
devuelve el tamaño de un contenedor o array
(plantilla de función)