std::ranges::crend
| Definiert in der Header-Datei <ranges> |
||
| Definiert in Header <iterator> |
||
| inline namespace /* nicht spezifiziert */ { inline constexpr /* unspecified */ crend = /* unspecified */; |
(seit C++20) (Customization-Point-Objekt) |
|
| Aufruf-Signatur |
||
| template< class T > requires /* siehe unten */ |
(seit C++20) | |
Gibt ein Sentinel für den konstanten Iterator zurück für den konstanten Iterator(seit C++23), der das Ende eines const-qualifizierten(bis C++23) Bereichs kennzeichnet, der als umgekehrte Sequenz behandelt wird.
|
Sei
Ein Aufruf von |
(bis C++23) |
|
Wenn das Argument ein lvalue oder ranges::enable_borrowed_range<std::remove_cv_t<T>> ist true, dann ist ein Aufruf von
In allen anderen Fällen ist ein Aufruf von |
(seit C++23) |
Wenn ranges::crend(e) für einen Ausdruck e gültig ist, wobei decltype((e)) T ist, dann modelliert CT modelliert std::ranges::range, und(bis C++23) std::sentinel_for<S, I> in allen Fällen true, wobei S decltype(ranges::crend(e)) ist und I decltype(ranges::crbegin(e)) ist. Zusätzlich modelliert S constant-iterator, wenn es input_iterator modelliert.(seit C++23)
Customization Point Objects
Der Name ranges::crend bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular Klassentyps. Zu Illustrationszwecken wird die cv-unqualifizierte Version seines Typs als __crend_fn bezeichnet.
Alle Instanzen von __crend_fn sind gleich. Die Auswirkungen des Aufrufs unterschiedlicher Instanzen vom Typ __crend_fn auf dieselben Argumente sind äquivalent, unabhängig davon, ob der Ausdruck, der die Instanz bezeichnet, ein lvalue oder rvalue ist und ob er const-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann ranges::crend frei kopiert und seine Kopien können austauschbar verwendet werden.
Gegeben eine Menge von Typen Args..., wenn std::declval<Args>()... die Anforderungen für Argumente an ranges::crend oben erfüllen, dann modelliert __crend_fn
- std::invocable<__crend_fn, Args...>,
- std::invocable<const __crend_fn, Args...>,
- std::invocable<__crend_fn&, Args...>, und
- std::invocable<const __crend_fn&, Args...>.
Andernfalls nimmt kein Funktionsaufrufoperator von __crend_fn an der Überladungsauflösung teil.
[bearbeiten] Beispiel
#include <algorithm> #include <iostream> #include <iterator> #include <vector> int main() { int a[]{4, 6, -3, 9, 10}; std::cout << "Array backwards: "; namespace ranges = std::ranges; ranges::copy(ranges::rbegin(a), ranges::rend(a), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; std::cout << "Vector backwards: "; std::vector v{4, 6, -3, 9, 10}; ranges::copy(ranges::rbegin(v), ranges::rend(v), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; }
Ausgabe
Array backwards: 10 9 -3 6 4 Vector backwards: 10 9 -3 6 4
[bearbeiten] Siehe auch
| (C++20) |
gibt einen Reverse-End-Iterator zu einem Range zurück (Customization Point Objekt) |
| (C++14) |
gibt einen Reverse-End-Iterator für einen Container oder ein Array zurück (function template) |