Namespaces
Variants

std::ranges::take_view<V>:: end

From cppreference.net
Ranges library
Range adaptors
constexpr auto end ( ) requires ( ! /*simple-view*/ < V > ) ;
(1) (seit C++20)
constexpr auto end ( ) const requires ranges:: range < const V > ;
(2) (seit C++20)

Gibt einen Sentinel oder einen Iterator zurück, der das Ende der take_view repräsentiert. Das Ende der take_view ist entweder eins nach dem count ten Element im zugrunde liegenden Bereich oder das Ende des zugrunde liegenden Bereichs, falls dieser weniger als count Elemente besitzt.

1) Gibt einen take_view :: /*sentinel*/ < false > , einen std:: default_sentinel_t oder einen ranges:: iterator_t < V > zurück.
2) Gibt einen take_view :: /*sentinel*/ < true > , einen std:: default_sentinel_t , oder einen ranges:: iterator_t < const V > zurück.

Overload (1) nimmt nicht an der Überladungsauflösung teil, wenn V eine simple view ist (das heißt, wenn V und const V Views mit denselben Iterator- und Sentinel-Typen sind).

Inhaltsverzeichnis

Parameter

(keine)

Rückgabewert

Das Ergebnis hängt von den Konzepten ab, die vom möglicherweise const-qualifizierten zugrundeliegenden View-Typ Base erfüllt werden, also V für ( 1 ) oder const V für ( 2 ) .

Sei base_ die zugrundeliegende Ansicht.

Der zugrundeliegende View-Typ
erfüllt ...
random_access_range
ja nein
sized_range ja ranges:: begin ( base_ ) +
ranges:: range_difference_t < Base_ > ( this - > size ( ) )
std:: default_sentinel
nein
1) /*sentinel*/ < false > { ranges:: end ( base_ ) }
2) /*sentinel*/ < true > { ranges:: end ( base_ ) }

Beispiel

#include <iostream>
#include <iterator>
#include <list>
#include <ranges>
#include <type_traits>
namespace ranges = std::ranges;
namespace views = std::views;
int main()
{
    const auto list1 = {3, 1, 4, 1, 5};
    const auto seq1{list1 | views::take(4)};
    static_assert(ranges::sized_range<decltype(seq1)> and
                  ranges::random_access_range<decltype(seq1)> and
                  std::is_same_v<decltype(seq1.end()), decltype(list1.end())>);
    for (auto it = seq1.begin(); it != seq1.end(); ++it)
        std::cout << *it << ' ';
    std::cout << '\n';
    std::list list2{2, 7, 1, 8, 2};
    const auto seq2{list2 | views::take(4)};
    static_assert(ranges::sized_range<decltype(seq2)> and
                  not ranges::random_access_range<decltype(seq2)> and
                  std::is_same_v<decltype(seq2.end()), std::default_sentinel_t>);
    for (auto it = seq2.begin(); it != std::default_sentinel; ++it)
        std::cout << *it << ' ';
    std::cout << '\n';
}

Ausgabe:

3 1 4 1
2 7 1 8

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 Konvertierungen zwischen vorzeichenbehafteten und vorzeichenlosen Integer-Class-Typen könnten fehlschlagen explizit gemacht

Siehe auch

gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion)
Iterator-Adapter, der den Abstand zum Ende des Bereichs verfolgt
(Klassentemplate)
(C++20)
vergleicht einen Sentinel mit einem von take_view::begin zurückgegebenen Iterator
(Funktion)