Espacios de nombres
Variantes
Acciones

std::size, std::ssize

De cppreference.com
< cpp‎ | iterator
 
 
Biblioteca de iteradores
Conceptos de iteradores
Primitivas de iteradores
Conceptos de algoritmos y servicios
Conceptos invocables indirectos
Requerimientos comunes de algoritmos
Servicios
Adaptadores de iteradores
Iteradores de flujos
Puntos de personalización de iteradores
Operaciones de iteradores
(C++11)
(C++11)
Acceso a rangos
(C++11)(C++14)
(C++11)(C++14)
sizessize
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
Definido en el archivo de encabezado <array>
Definido en el archivo de encabezado <deque>
Definido en el archivo de encabezado <flat_map>
Definido en el archivo de encabezado <flat_set>
Definido en el archivo de encabezado <forward_list>
Definido en el archivo de encabezado <inplace_vector>
Definido en el archivo de encabezado <iterator>
Definido en el archivo de encabezado <list>
Definido en el archivo de encabezado <map>
Definido en el archivo de encabezado <regex>
Definido en el archivo de encabezado <set>
Definido en el archivo de encabezado <span>
Definido en el archivo de encabezado <string>
Definido en el archivo de encabezado <string_view>
Definido en el archivo de encabezado <unordered_map>
Definido en el archivo de encabezado <unordered_set>
Definido en el archivo de encabezado <vector>
template< class C >
constexpr auto size( const C& c ) -> decltype(c.size());
(1) (desde C++17)
template< class C >

constexpr auto ssize( const C& c )
    -> std::common_type_t<std::ptrdiff_t,

                          std::make_signed_t<decltype(c.size())>>;
(2) (desde C++20)
template< class T, std::size_t N >
constexpr std::size_t size( const T (&array)[N] ) noexcept;
(3) (desde C++17)
template< class T, std::ptrdiff_t N >
constexpr std::ptrdiff_t ssize( const T (&array)[N] ) noexcept;
(4) (desde C++20)

Devuelve el tamaño de un rango dado.

1, 2) Devuelve c.size(), convertido al tipo de retorno si es necesario.
3, 4) Devuelve N.

Contenido

[editar] Parámetros

c - Un contenedor o vista con una función miembro size.
array - Un array de tipo arbitrario.

[editar] Valor de retorno

1) c.size(),
2) static_cast<std::common_type_t<std::ptrdiff_t,
                               std::make_signed_t<decltype(c.size())>>>(c.size())
.
3,4) N.

[editar] Excepciones

1,2) Puede lanzar excepciones definidas por la implementación.

[editar] Sobrecargas

Se pueden proporcionar sobrecargas personalizadas de size para clases y enumeraciones que no exponen una función miembro size() adecuada, pero que se pueden detectar.

Las sobrecargas de size detectadas por la búsqueda dependiente de argumentos se pueden usar para personalizar el comportamiento de std::ranges::size, std::ranges::ssize y std::ranges::empty.

(desde C++20)

[editar] Posible implementación

size (1)
template<class C>
constexpr auto size(const C& c) -> decltype(c.size())
{
    return c.size();
}
ssize (2)
template<class C>
constexpr auto ssize(const C& c)
    -> std::common_type_t<std::ptrdiff_t,
                          std::make_signed_t<decltype(c.size())>>
{
    using R = std::common_type_t<std::ptrdiff_t,
                                 std::make_signed_t<decltype(c.size())>>;
    return static_cast<R>(c.size());
}
size (3)
template<class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}
ssize (4)
template<class T, std::ptrdiff_t N>
constexpr std::ptrdiff_t ssize(const T (&array)[N]) noexcept
{
    return N;
}

[editar] Notas

Macro de prueba de característica Valor Estándar Comentario
__cpp_lib_nonmember_container_access 201411L (C++17) std::size(), std::data y std::empty.
__cpp_lib_ssize 201902L (C++20) std::ssize() (2,4) y std::span::size() sin signo.

[editar] Ejemplo

#include <cassert>
#include <cstring>
#include <iostream>
#include <vector>
 
int main()
{
    // Funciona con contenedores
    std::vector<int> v{3, 1, 4};
    assert(std::size(v) == 3);
 
    // Y también funciona con arrays integrados
    int a[]{-5, 10, 15};
    // Devuelve el número de elementos (no bytes) en lugar de sizeof
    assert(std::size(a) == 3);
    std::cout << "tamaño de a[]: " << sizeof a << '\n'; // 12, if sizeof(int) == 4
 
    // Proporciona una forma segura (en comparación con sizeof)
    // de obtener el tamaño del búfer de cadena
    const char str[] = "12345";
    // Estos están bien y dan el resultado correcto.
    assert(std::size(str) == 6);
    assert(sizeof(str) == 6);
 
    // Pero el uso de sizeof aquí es una fuente común de errores.
    const char* str_decayed = "12345";
    // std::cout << std::size(str_decayed) << '\n'; // Útilmente no se compila
    std::cout << sizeof(str_decayed) << '\n'; // ¡Imprime el tamaño del puntero!
 
    // Desde C++20 el tamaño con signo (std::ssize) está disponible
    auto i = std::ssize(v);
    for (--i; i != -1; --i)
        std::cout << v[i] << (i ? ' ' : '\n');
    assert(i == -1);
 
    // Ten en cuenta que el literal de cadena incluye el carácter nulo final, que
    // será parte del array de caracteres construida. Esto hace que std::size
    // se comporte de manera diferente a std::strlen y std::string::size:
    constexpr char symbols[] = "0123456789";
 
    static_assert(std::size(symbols) == 11);
    static_assert(std::string(symbols).size() == 10);
    assert(std::strlen(symbols) == 10);
}

Posible salida:

tamaño de a[]: 12
8
4 1 3

[editar] Véase también

Tipo entero con signo devuelto al restar dos punteros.
(typedef) [editar]
Tipo entero sin signo devuelto por el operador sizeof.
(typedef) [editar]
Obtiene el tamaño de un rango cuyo tamaño puede calcularse en tiempo constante.
(objeto punto de personalización) [editar]
Obtiene el tamaño de un rango cuyo tamaño puede calcularse en tiempo constante y lo convierte a un entero con signo.
(objeto punto de personalización) [editar]