std::ranges::size
| 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
Tein Array mit unbekannter Grenze ist, istranges::size(E)fehlerhaft. - Ansonsten, wenn
Tein Array-Typ ist, istranges::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>>istfalse.- 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):Tist ein Klassen- oder Aufzählungstyp.ranges::disable_sized_range<std::remove_cv_t<T>>istfalse.- decay-copy
(size(t))(bis C++23)auto(size(t))(seit C++23) ist ein gültiger Ausdruck von ganzzahligem Typ, wobei die Bedeutung vonsizeso 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 zuto-unsigned-like(ranges::end(t) - ranges::begin(t)):Tmodelliert forward_range.- Gegeben sei der Typ von
ranges::begin(t)alsIund der Typ vonranges::end(t)alsS, werden sowohl sized_sentinel_for<S, I>als auch forward_iterator<I>modelliert. to-unsigned-like(ranges::end(t) - ranges::begin(t))ist ein gültiger Ausdruck.
- 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
|
(C++20)
|
gibt eine vorzeichenbehaftete Ganzzahl zurück, die der Größe eines Ranges entspricht
(Customization Point Object) |
|
(C++20)
|
spezifiziert, dass ein Range seine Größe in konstanter Zeit kennt
(Konzept) |
|
(C++20)
|
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) |