Namespaces
Variants

std::ranges:: size

From cppreference.net
Ranges library
Range adaptors
Definiert in Header <ranges>
Definiert in Header <iterator>
inline namespace /* unspecified */ {

inline constexpr auto size = /* unspecified */ ;

}
(seit C++20)
(Anpassungspunktobjekt)
Aufrufsignatur
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 sei das Subexpression von dem t das (möglicherweise materialisierte ) Ergebnisobjekt als E bezeichnet, und der Typ von E als T :

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

Inhaltsverzeichnis

Customization Point Objects

Der Name ranges::size bezeichnet ein Customization Point Object , welches ein konstantes Funktionsobjekt eines Literal semiregular -Klassentyps ist. Weitere Details finden Sie unter CustomizationPointObject .

Hinweise

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

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

Der Ausdruck ranges:: distance ( e ) kann ebenfalls verwendet werden, um die Größe eines Ranges e zu bestimmen. Im Gegensatz zu ranges :: size ( e ) funktioniert ranges:: distance ( e ) selbst dann, wenn e ein unsized Range ist, allerdings auf Kosten linearer Komplexität in diesem Fall.

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 hat eine bekannte Grenze
    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

Fehlerberichte

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 existiert ein Mechanismus, um bestimmte non-member size zu verbieten, die durch ADL gefunden werden Dieser Mechanismus wurde entfernt

Siehe auch

gibt eine vorzeichenbehaftete Ganzzahl zurück, die der Größe eines Ranges entspricht
(Customization Point Object)
spezifiziert, dass ein Range seine Größe in konstanter Zeit kennt
(Konzept)
gibt den Abstand zwischen einem Iterator und einem Sentinel oder zwischen Anfang und Ende eines Ranges zurück
(Algorithm Function Object)
(C++17) (C++20)
gibt die Größe eines Containers oder Arrays zurück
(Function Template)