Namespaces
Variants

std::size, std::ssize

Von de.cppreference.net
 
 
Iteratorenbibliothek
Iteratorkonzepte
Iterator-Grundtypen
Algorithmus-Konzepte und Hilfsmittel
Indirekt aufrufbare Konzepte
Allgemeine Algorithmusanforderungen
(C++20)
(C++20)
(C++20)
Hilfsmittel
(C++20)
Iterator-Adapter
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
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.

1,2) Gibt c.size() zurück, falls nötig in den Rückgabetyp konvertiert.
3,4) Gibt N zurück.

Parameter

c - ein Container oder eine View mit einer size Memberfunktion
array - ein Array beliebigen Typs

Rückgabewert

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) Kann implementierungsdefinierte Ausnahmen werfen.

Ü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 size können verwendet werden, um das Verhalten von std :: ranges:: size , std :: ranges:: ssize und std :: ranges:: empty anzupassen.

(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 weiterzugeben
2) 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)
gibt einen ganzzahligen Wert gleich der Größe eines Ranges zurück
(customization point object)
gibt einen vorzeichenbehafteten ganzzahligen Wert gleich der Größe eines Ranges zurück
(customization point object)