std::size, std::ssize
| 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.
c.size(), converti au type de retour si nécessaire.N.Paramètres
| c | - |
un conteneur ou une vue avec une fonction membre
size
|
| array | - | un tableau de type arbitraire |
Valeur de retour
std:: make_signed_t < decltype ( c. size ( ) ) >>> ( c. size ( ) )
Exceptions
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
|
(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'exception2) 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) |
|
|
(C++20)
|
retourne un entier égal à la taille d'une plage
(customization point object) |
|
(C++20)
|
retourne un entier signé égal à la taille d'une plage
(customization point object) |