Namespaces
Variants

std::size, std::ssize

Depuis fr.cppreference.net
 
 
Bibliothèque d'itérateurs
Concepts d'itérateurs
Primitives d'itérateur
Concepts et utilitaires d'algorithmes
Concepts d'appel indirect
Exigences communes des algorithmes
(C++20)
(C++20)
(C++20)
Utilitaires
(C++20)
Adaptateurs d'itérateur
Accès aux plages
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(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>
 (depuis C++23)
Défini dans l'en-tête <flat_set>
 (depuis C++23)
Défini dans l'en-tête <forward_list>
Défini dans l'en-tête <inplace_vector>
 (depuis C++26)
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 <optional>
 (depuis C++26)
Défini dans l'en-tête <regex>
Défini dans l'en-tête <set>
Défini dans l'en-tête <span>
 (depuis C++20)
Défini dans l'en-tête <stacktrace>
 (depuis C++23)
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 <valarray>
Défini dans l'en-tête <vector>
template< class C >
constexpr auto size( const C& c ) noexcept(noexcept(c.size()))
    -> decltype(c.size());
(1) (depuis C++17)
template< class C >
constexpr auto ssize( const C& c ) noexcept(noexcept(c.size()))
    -> 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)

Renvoie la taille de la plage donnée.

1,2) Renvoie c.size(), converti au type de retour si nécessaire.
3,4) Renvoie N.

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

Rapport de défaut

Les rapports de défaut suivants, modifiant le comportement, ont été appliqués rétroactivement aux normes C++ publiées précédemment.

DR Appliqué à Comportement tel que publié Comportement correct
P3016R6 C++17
C++20
1) std::size n'était pas tenu de propager la spécification d'exception
2) std::ssize n'était pas tenu de propager la spécification d'exception
requis

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)