Namespaces
Variants

std::ranges::size

Von de.cppreference.net
 
 
Ranges-Bibliothek
Range-Adaptoren
 
Definiert in Header <ranges>
Definiert in Header <iterator>
inline namespace /* unspecified */ {
    inline constexpr auto size = /* unspecified */;
}
(seit C++20)
(Customization-Point-Objekt)
Aufrufsignatur
template< class T >
    requires /* see below */
constexpr auto size( T&& t );
(seit C++20)

Berechnet die Anzahl der Elemente in t in konstanter Zeit.

Gegeben sei der Teilausdruck, von dem t das (möglicherweise materialisierte) Ergebnisobjekt als E bezeichnet, und der Typ von E als T:

  • Wenn T ein Array mit unbekannter Grenze ist, ist ranges::size(E) fehlerhaft.
  • Ansonsten, wenn T ein Array-Typ ist, ist ranges::size(E) ausdrucksäquivalent zu decay-copy (std::extent_v<T>)(bis C++23)auto(std::extent_v<T>)(seit C++23).
  • Ansonsten, wenn alle folgenden Bedingungen erfüllt sind, ist ranges::size(E) ausdrucksäquivalent zu decay-copy (t.size())(bis C++23)auto(t.size())(seit C++23):
    • ranges::disable_sized_range<std::remove_cv_t<T>> ist false.
    • decay-copy (t.size())(bis C++23)auto(t.size())(seit C++23) ist ein gültiger Ausdruck von ganzzahligem Typ.
  • Ansonsten, wenn alle folgenden Bedingungen erfüllt sind, ist ranges::size(E) ausdrucksäquivalent zu decay-copy (size(t))(bis C++23)auto(size(t))(seit C++23):
    • T ist ein Klassen- oder Aufzählungstyp.
    • ranges::disable_sized_range<std::remove_cv_t<T>> ist false.
    • decay-copy (size(t))(bis C++23)auto(size(t))(seit C++23) ist ein gültiger Ausdruck von ganzzahligem Typ, wobei die Bedeutung von size so ermittelt wird, als ob nur argumentabhängige Namenssuche durchgeführt würde.
  • Ansonsten, wenn alle folgenden Bedingungen erfüllt sind, ist ranges::size(E) ausdrucksäquivalent zu to-unsigned-like (ranges::end(t) - ranges::begin(t)):
  • Andernfalls ist ranges::size(E) fehlerhaft.

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

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)