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)
(Anmerkung: Der bereitgestellte HTML-Code enthält keinen übersetzbaren Text, da alle Tags und Attribute gemäß den Anweisungen unverändert bleiben sollen und die Tabellenzellen leer sind.)
Definiert im Header <array>
Definiert im Header <deque>
Definiert in Header <flat_map>
Definiert in Header <flat_set>
Definiert in Header <forward_list>
Definiert im Header <inplace_vector>
Definiert im Header <iterator>
Definiert im Header <list>
Definiert im Header <map>
Definiert in Header <regex>
Definiert in Header <set>
Definiert in Header <span>
Definiert in Header <string>
Definiert im Header <string_view>
Definiert in Header <unordered_map>
Definiert im Header <unordered_set>
Definiert im Header <vector>
template < class C >
constexpr auto size ( const C & c ) - > decltype ( c. size ( ) ) ;
(1) (seit 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) (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, konvertiert in den Rückgabetyp falls notwendig.
3,4) Gibt N zurück.

Inhaltsverzeichnis

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

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)