Namensräume
Varianten
Aktionen

std::ranges::Größe

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
Definiert in Header <iterator>
inline namespace /* nicht spezifiziert */ {

    inline constexpr auto size = /* nicht spezifiziert */;

}
(seit C++20)
(Customization-Point-Objekt)
Aufruf-Signatur
template< class T >

    requires /* siehe unten */

constexpr auto size( T&& t );
(seit C++20)

Berechnet die Anzahl der Elemente in t in konstanter Zeit.

Gegeben die Subexpression, deren (möglicherweise materialisiertes) Ergebnisobjekt t bezeichnet, als E, und den Typ von E als T

Diagnostizierbare fehlerhafte Fälle führen zu Substitutionsfehlern, wenn ranges::size(E) im unmittelbaren Kontext einer Template-Instanziierung erscheint.

Inhalt

Customization Point Objects

Der Name ranges::size bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular-Klassentyps. Zu Ausübungszwecken wird die cv-unqualifizierte Version seines Typs als __size_fn bezeichnet.

Alle Instanzen von __size_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen des Typs __size_fn auf dieselben Argumente sind äquivalent, unabhängig davon, ob der Ausdruck, der die Instanz bezeichnet, ein lvalue oder rvalue ist und ob er const-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann ranges::size frei kopiert werden und seine Kopien sind austauschbar.

Gegeben eine Menge von Typen Args..., wenn std::declval<Args>()... die oben genannten Anforderungen für Argumente von ranges::size erfüllt, modelliert __size_fn

Andernfalls nimmt kein operator() von __size_fn an der Überladungsauflösung teil.

[bearbeiten] Hinweise

Immer wenn ranges::size(e) für einen Ausdruck e gültig ist, ist der Rückgabetyp integer-ähnlich.

Der C++20-Standard verlangt, dass, wenn der zugrunde liegende size-Funktionsaufruf einen prvalue zurückgibt, der Rückgabewert aus dem materialisierten temporären Objekt move-konstruiert wird. Alle Implementierungen geben den prvalue stattdessen direkt zurück. Die Anforderung wird durch den Post-C++20-Vorschlag P0849R8 korrigiert, um die Implementierungen anzupassen.

Der Ausdruck ranges::distance(e) kann ebenfalls verwendet werden, um die Größe eines Bereichs e zu ermitteln. Im Gegensatz zu ranges::size(e) funktioniert ranges::distance(e) auch dann, wenn e ein unsized range ist, allerdings auf Kosten einer linearen Komplexität in diesem Fall.

[bearbeiten] Beispiel

#include <iostream>
#include <ranges>
#include <type_traits>
#include <vector>
 
int main()
{
    auto v = std::vector<int>{};
    std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n';
 
    auto il = {7};     // std::initializer_list
    std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n';
 
    int array[]{4, 5}; // array has a known bound
    std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n';
 
    static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false);
}

Ausgabe

ranges::size(v) == 0
ranges::size(il) == 1
ranges::size(array) == 2

[bearbeiten] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
P2602R2 C++20 Es gibt Mechanismen, um bestimmte Nicht-Member-size, die von ADL gefunden werden, zu verbieten solche Mechanismen wurden entfernt.

[bearbeiten] Siehe auch

gibt eine vorzeichenbehaftete Ganzzahl zurück, die der Größe eines Ranges entspricht
(Customization Point Objekt)[edit]
spezifiziert, dass ein Range seine Größe in konstanter Zeit kennt
(Konzept) [edit]
gibt die Distanz zwischen einem Iterator und einem Sentinel zurück oder die Distanz zwischen dem Anfang und dem Ende eines Bereichs
(Algorithmus-Funktionsobjekt)[bearbeiten]
(C++17)(C++20)
gibt die Größe eines Containers oder Arrays zurück
(Funktionsvorlage) [bearbeiten]