std::ranges::views:: counted
| Definiert in der Header-Datei <ranges> |
||
| inline constexpr /*unspecified*/ counted = /*unspecified*/; |
(seit C++20) | |
| Aufruf-Signatur |
||
| template< class Iterator, class DifferenceType > requires /* siehe unten */ |
(seit C++20) | |
Eine gezählte Ansicht (counted view) präsentiert eine view der Elemente des gezählten Bereichs [i, n) für einen Iterator i und eine nicht-negative Ganzzahl n.
Ein gezählter Bereich [i, n) besteht aus den n Elementen, beginnend mit dem Element, auf das i zeigt, und bis zu, aber nicht einschließlich, dem Element, falls vorhanden, auf das das Ergebnis von n Anwendungen von ++i zeigt.
Wenn n == 0 ist, ist der gezählte Bereich gültig und leer. Andernfalls ist der gezählte Bereich nur gültig, wenn n positiv ist, i dereferenzierbar ist und [++i, --n) ein gültiger gezählter Bereich ist.
Formal gilt: Wenn it und count Ausdrücke sind, T std::decay_t<decltype((it))> ist und D std::iter_difference_t<T> ist, dann
- wenn
Tinput_or_output_iteratormodelliert und decltype((count)) std::convertible_to<D> modelliert,- wenn
Tcontiguous_iteratormodelliert, dann ist views::counted(it, count) ausdrucksäquivalent zu std::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))), - ansonsten, wenn
Trandom_access_iteratormodelliert, dann ist views::counted(it, count) ausdrucksäquivalent zu ranges::subrange(it, it + static_cast<D>(count)), - ansonsten ist views::counted(it, count) ausdrucksäquivalent zu ranges::subrange(std::counted_iterator(it, count), std::default_sentinel).
- wenn
- Andernfalls ist views::counted(it, count) ill-formed.
Inhalt |
Customization Point Objects
Der Name views::counted bezeichnet ein Customization Point Object, das ist ein konstantes Function Object eines literal semiregular Klassentyps. Zu Ausstellungszwecken wird die cv-unqualified Version seines Typs als __counted_fn bezeichnet.
Alle Instanzen von __counted_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen vom Typ __counted_fn mit denselben Argumenten sind äquivalent, unabhängig davon, ob der die Instanz bezeichnende Ausdruck ein lvalue oder rvalue ist und ob er const-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Somit kann views::counted frei kopiert werden und seine Kopien können austauschbar verwendet werden.
Gegeben eine Menge von Typen Args..., wenn std::declval<Args>()... die obigen Anforderungen für Argumente an views::counted erfüllt, dann modelliert __counted_fn
- std::invocable<__counted_fn, Args...>,
- std::invocable<const __counted_fn, Args...>,
- std::invocable<__counted_fn&, Args...> und
- std::invocable<const __counted_fn&, Args...>.
Andernfalls nimmt kein Funktionsaufrufoperator von __counted_fn an der Überladungsauflösung teil.
[edit] Anmerkungen
views::counted prüft nicht, ob der Bereich lang genug ist, um alle count Elemente bereitzustellen: Verwenden Sie views::take, wenn diese Prüfung notwendig ist.
[edit] Beispiel
#include <iostream> #include <ranges> int main() { const int a[]{1, 2, 3, 4, 5, 6, 7}; for (int i : std::views::counted(a, 3)) std::cout << i << ' '; std::cout << '\n'; const auto il = {1, 2, 3, 4, 5}; for (int i : std::views::counted(il.begin() + 1, 3)) std::cout << i << ' '; std::cout << '\n'; }
Ausgabe
1 2 3 2 3 4
[edit] 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 |
|---|---|---|---|
| P2393R1 | C++20 | Implizite Konvertierung von einem Integer-Klassen-Typ nach std::size_t kann ungültig sein | explizit gemacht |
[edit] Siehe auch
| (C++20) |
ein view, der aus den ersten N Elementen eines anderen view besteht(Klassen-Template) (Range-Adaptor-Objekt) |
| (C++20) |
kombiniert ein Iterator-Sentinel-Paar zu einer view(Klassenschablone) |
| (C++20) |
Iterator-Adapter, der den Abstand zum Ende des Bereichs verfolgt (Klassenvorlage) |
| (C++20)(C++20) |
Gibt die Anzahl der Elemente zurück, die bestimmte Kriterien erfüllen (Algorithmus-Funktionsobjekt) |