std::size, std::ssize
| Definiert in Header <array>
|
||
| Definiert in Header <deque>
|
||
| Definiert in Header <flat_map>
|
(seit C++23) |
|
| Definiert in Header <flat_set>
|
(seit C++23) |
|
| Definiert in Header <forward_list>
|
||
| Definiert in Header <inplace_vector>
|
(seit C++26) |
|
| Definiert in Header <iterator>
|
||
| Definiert in Header <list>
|
||
| Definiert in Header <map>
|
||
| Definiert in Header <optional>
|
(seit C++26) |
|
| Definiert in Header <regex>
|
||
| Definiert in Header <set>
|
||
| Definiert in Header <span>
|
(seit C++20) |
|
| Definiert in Header <stacktrace>
|
(seit C++23) |
|
| Definiert in Header <string>
|
||
| Definiert in Header <string_view>
|
||
| Definiert in Header <unordered_map>
|
||
| Definiert in Header <unordered_set>
|
||
| Definiert in Header <valarray>
|
||
| Definiert in Header <vector>
|
||
template< class C >
constexpr auto size( const C& c ) noexcept(noexcept(c.size()))
-> decltype(c.size());
|
(1) | (seit 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) | (seit C++20) |
template< class T, std::size_t N >
constexpr std::size_t size( const T (&array)[N] ) noexcept;
|
(3) | (seit C++17) |
template< class T, std::ptrdiff_t N >
constexpr std::ptrdiff_t ssize( const T (&array)[N] ) noexcept;
|
(4) | (seit C++20) |
Gibt die Größe des angegebenen Bereichs zurück.
c.size() zurück, falls nötig in den Rückgabetyp konvertiert.N zurück.Parameter
| c | - |
ein Container oder eine View mit einer
size
Memberfunktion
|
| array | - | ein Array beliebigen Typs |
Rückgabewert
std:: make_signed_t < decltype ( c. size ( ) ) >>> ( c. size ( ) )
Exceptions
Überladungen
Benutzerdefinierte Überladungen von
size
können für Klassen und Aufzählungen bereitgestellt werden, die keine geeignete
size()
Memberfunktion bereitstellen, aber dennoch erkannt werden können.
|
Durch
argumentabhängige Namenssuche
gefundene Überladungen von
|
(seit C++20) |
Mögliche Implementierung
| Größe (1) |
|---|
template<class C> constexpr auto size(const C& c) -> decltype(c.size()) { return c.size(); } |
| SGröße (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()); } |
| Größe (3) |
template<class T, std::size_t N> constexpr std::size_t size(const T (&array)[N]) noexcept { return N; } |
| SGröße (4) |
template<class T, std::ptrdiff_t N> constexpr std::ptrdiff_t ssize(const T (&array)[N]) noexcept { return N; } |
Hinweise
| Feature-Test Makro | Wert | Standard | Funktion |
|---|---|---|---|
__cpp_lib_nonmember_container_access
|
201411L
|
(C++17) |
std::size()
,
std::data
und
std::empty
|
__cpp_lib_ssize
|
201902L
|
(C++20) |
std::ssize()
(
2,4
)
und vorzeichenloser
std::span::size()
|
Beispiel
#include <cassert> #include <cstring> #include <iostream> #include <vector> int main() { // Funktioniert mit Containern std::vector<int> v{3, 1, 4}; assert(std::size(v) == 3); // Und funktioniert auch mit eingebauten Arrays int a[]{-5, 10, 15}; // Gibt die Anzahl der Elemente zurück (nicht Bytes) im Gegensatz zu sizeof assert(std::size(a) == 3); std::cout << "Größe von a[]: " << sizeof a << '\n'; // 12, wenn sizeof(int) == 4 // Bietet eine sichere Methode (im Vergleich zu sizeof) zum Erhalten der String-Puffergröße const char str[] = "12345"; // Diese sind in Ordnung und liefern das korrekte Ergebnis assert(std::size(str) == 6); assert(sizeof(str) == 6); // Die Verwendung von sizeof ist hier jedoch eine häufige Fehlerquelle const char* str_decayed = "12345"; // std::cout << std::size(str_decayed) << '\n'; // Scheitert sinnvollerweise beim Kompilieren std::cout << sizeof(str_decayed) << '\n'; // Gibt die Größe des Zeigers aus! // Seit C++20 ist die vorzeichenbehaftete Größe (std::ssize) verfügbar auto i = std::ssize(v); for (--i; i != -1; --i) std::cout << v[i] << (i ? ' ' : '\n'); assert(i == -1); // Beachten Sie, dass das String-Literal das abschließende Nullzeichen enthält, // das Teil des konstruierten Zeichenarrays sein wird. Dies führt dazu, dass sich std::size // anders verhält als std::strlen und 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); }
Mögliche Ausgabe:
Größe von a[]: 12 8 4 1 3
Fehlerbericht
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| Fehlerbericht | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| P3016R6 | C++17 C++20 |
1) std::size war nicht erforderlich, um die Ausnahmespezifikation weiterzugeben2) std::ssize war nicht erforderlich, um die Ausnahmespezifikation weiterzugeben
|
erforderlich |
Siehe auch
|
vorzeichenbehafteter Ganzzahltyp, der bei der Subtraktion zweier Zeiger zurückgegeben wird
(typedef) |
|
|
vorzeichenloser Ganzzahltyp, der vom
sizeof
Operator zurückgegeben wird
(typedef) |
|
|
(C++20)
|
gibt einen ganzzahligen Wert gleich der Größe eines Ranges zurück
(customization point object) |
|
(C++20)
|
gibt einen vorzeichenbehafteten ganzzahligen Wert gleich der Größe eines Ranges zurück
(customization point object) |