std::ranges:: size
|
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 */
|
(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
:
-
Wenn
Tein Array mit unbekannter Grenze ist, ranges :: size ( E ) ist fehlerhaft. -
Andernfalls, falls
Tein 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) . -
Andernfalls, wenn alle folgenden Bedingungen erfüllt sind,
ranges
::
size
(
E
)
ist 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 vom integer-ähnlichen Typ .
-
Andernfalls, wenn alle folgenden Bedingungen erfüllt sind,
ranges
::
size
(
E
)
ausdrucksäquivalent zu
decay-copy
(
size
(
t
)
)
(bis C++23)
auto
(
size
(
t
)
)
(seit C++23)
ist:
-
Tist 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)
ein gültiger Ausdruck von integer-ähnlichem Typ ist, wobei die Bedeutung von
sizeso festgelegt wird, als würde nur argumentabhängige Suche durchgeführt.
-
-
Andernfalls, wenn alle folgenden Bedingungen erfüllt sind,
ranges
::
size
(
E
)
ist ausdrucksäquivalent zu
to-unsigned-like ( ranges:: end ( t ) - ranges:: begin ( t ) ) :-
Tmodelliertforward_range. -
Gegeben den Typ von
ranges::
begin
(
t
)
als
Iund den Typ von ranges:: end ( t ) alsS, werden sowohlsized_sentinel_for< S, I > als auchforward_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-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
|
(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) |