Namespaces
Variants

std::ranges::views::counted

Von de.cppreference.net
 
 
Range-Bibliothek
Range-Adaptoren
 
Definiert in Header <ranges>
inline constexpr /* unspecified */ counted = /* unspecified */;
(seit C++20)
Aufrufsignatur
template< class Iterator, class DifferenceType >
    requires /* see below */
constexpr /*span-or-subrange*/ counted( Iterator&& it, DifferenceType&& count );
(seit C++20)

Ein counted view präsentiert eine view der Elemente des counted range [i, n) für einen Iterator i und eine nicht-negative ganze Zahl n.

Ein counted range [i, n) ist die n Elemente, beginnend mit dem Element, auf das i zeigt, und bis zu, aber nicht einschließlich des Elements, auf das das Ergebnis von n Anwendungen von ++i zeigt.

Wenn n == 0, ist der counted range gültig und leer. Andernfalls ist der counted range nur gültig, wenn n positiv ist, i dereferenzierbar ist und [++i, --n) ein gültiger counted range ist.

Formal: Wenn it und count Ausdrücke sind, T std::decay_t<decltype((it))> ist, und D std::iter_difference_t<T> ist, dann

wenn T das Konzept input_or_output_iterator modelliert und decltype((count)) std::convertible_to<D> modelliert,
  • wenn T das Konzept contiguous_iterator modelliert, dann ist views::counted(it, count) ausdrucksäquivalent zu std::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))),
  • andernfalls, wenn T das Konzept random_access_iterator modelliert, dann ist views::counted(it, count) ausdrucksäquivalent zu ranges::subrange(it, it + static_cast<D>(count)),
  • andernfalls ist views::counted(it, count) ausdrucksäquivalent zu ranges::subrange(std::counted_iterator(it, count), std::default_sentinel).
Andernfalls ist views::counted(it, count) fehlerhaft.

Customization-Point-Objekte

Der Name views::counted bezeichnet ein Customization-Point-Objekt, das ein konstantes Funktionsobjekt eines literal semiregulären Klassentyps ist. Siehe CustomizationPointObject für Details.

Anmerkungen

views::counted prüft nicht, ob der Range lang genug ist, um alle count Elemente bereitzustellen: verwenden Sie views::take, wenn diese Prüfung erforderlich ist.

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
P2393R1 C++20 implizite Konvertierung von einem Integer-Klassentyp zu std::size_t könnte ungültig sein explizit gemacht

Siehe auch

eine view, die aus den ersten N Elementen einer anderen view
besteht(Klassenvorlage) (Range-Adaptor-Objekt)
kombiniert ein Iterator-Sentinel-Paar zu einer view
(Klassenvorlage)
Iterator-Adapter, der die Entfernung zum Ende des Ranges verfolgt
(Klassenvorlage)
gibt die Anzahl der Elemente zurück, die bestimmte Kriterien erfüllen
(Algorithmus-Funktionsobjekt)