Namespaces
Variants

std:: size, std:: ssize

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
size ssize
(C++17) (C++20)
(C++17)
(C++17)
Défini dans l'en-tête <array>
Défini dans l'en-tête <deque>
Défini dans l'en-tête <flat_map>
Défini dans l'en-tête <flat_set>
Défini dans l'en-tête <forward_list>
Défini dans l'en-tête <inplace_vector>
Défini dans l'en-tête <iterator>
Défini dans l'en-tête <list>
Défini dans l'en-tête <map>
Défini dans l'en-tête <regex>
Défini dans l'en-tête <set>
Défini dans l'en-tête <span>
Défini dans l'en-tête <string>
Défini dans l'en-tête <string_view>
Défini dans l'en-tête <unordered_map>
Défini dans l'en-tête <unordered_set>
Défini dans l'en-tête <vector>
template < class C >
constexpr auto size ( const C & c ) - > decltype ( c. size ( ) ) ;
(1) (depuis 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) (depuis C++20)
template < class T, std:: size_t N >
constexpr std:: size_t size ( const T ( & array ) [ N ] ) noexcept ;
(3) (depuis C++17)
template < class T, std:: ptrdiff_t N >
constexpr std:: ptrdiff_t ssize ( const T ( & array ) [ N ] ) noexcept ;
(4) (depuis C++20)

Retourne la taille de la plage donnée.

1,2) Retourne c. size ( ) , converti vers le type de retour si nécessaire.
3,4) Retourne N .

Table des matières

Paramètres

c - un conteneur ou une vue avec une fonction membre size
array - un tableau de type arbitraire

Valeur de retour

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

Exceptions

1,2) Peut lever des exceptions définies par l'implémentation.

Surcharges

Des surcharges personnalisées de size peuvent être fournies pour les classes et les énumérations qui n'exposent pas de fonction membre size() appropriée, mais qui peuvent être détectées.

Les surcharges de size trouvées par la recherche dépendante des arguments peuvent être utilisées pour personnaliser le comportement de std :: ranges:: size , std :: ranges:: ssize , et std :: ranges:: empty .

(depuis C++20)

Implémentation possible

taille (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());
}
taille (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;
}

Notes

Macro de test de fonctionnalité Valeur Norme Fonctionnalité
__cpp_lib_nonmember_container_access 201411L (C++17) std::size() , std::data et std::empty
__cpp_lib_ssize 201902L (C++20) std::ssize() ( 2,4 ) et std::span::size() non signé

Exemple

#include <cassert>
#include <cstring>
#include <iostream>
#include <vector>
int main()
{
    // Fonctionne avec les conteneurs
    std::vector<int> v{3, 1, 4};
    assert(std::size(v) == 3);
    // Et fonctionne également avec les tableaux natifs
    int a[]{-5, 10, 15};
    // Retourne le nombre d'éléments (pas les octets) contrairement à sizeof
    assert(std::size(a) == 3);
    std::cout << "taille de a[]: " << sizeof a << '\n'; // 12, si sizeof(int) == 4
    // Fournit une méthode sûre (comparée à sizeof) pour obtenir la taille du tampon de chaîne
    const char str[] = "12345";
    // Ces instructions sont correctes et donnent le bon résultat
    assert(std::size(str) == 6);
    assert(sizeof(str) == 6);
    // Mais l'utilisation de sizeof ici est une source courante de bugs
    const char* str_decayed = "12345";
    // std::cout << std::size(str_decayed) << '\n'; // Échoue utilement à la compilation
    std::cout << sizeof(str_decayed) << '\n'; // Affiche la taille du pointeur !
    // Depuis C++20, la taille signée (std::ssize) est disponible
    auto i = std::ssize(v);
    for (--i; i != -1; --i)
        std::cout << v[i] << (i ? ' ' : '\n');
    assert(i == -1);
    // Notez que le littéral de chaîne inclut le caractère nul de fin, qui
    // fera partie du tableau de caractères construit. Cela fait que std::size
    // se comporte différemment de std::strlen et 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);
}

Sortie possible :

taille de a[]: 12
8
4 1 3

Voir aussi

type entier signé retourné lors de la soustraction de deux pointeurs
(typedef)
type entier non signé retourné par l'opérateur sizeof
(typedef)
retourne un entier égal à la taille d'une plage
(customization point object)
retourne un entier signé égal à la taille d'une plage
(customization point object)