Namespaces
Variants

std::ranges::views::take, std::ranges::take_view

Von de.cppreference.net
 
 
Ranges-Bibliothek
Range-Adaptoren
 
 
Definiert in Header <ranges>
template< ranges::view V >
class take_view
    : public ranges::view_interface<take_view<V>>
(1) (seit C++20)
namespace views {
    inline constexpr /* unspecified */ take = /* unspecified */;
}
(2) (seit C++20)
Aufrufsignatur
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto
    take( R&& r, ranges::range_difference_t<R> count );
(seit C++20)
template< class DifferenceType >
constexpr /* range adaptor closure */ take( DifferenceType&& count );
(seit C++20)
1) Ein Range-Adaptor, der eine View der Elemente aus einer zugrundeliegenden Sequenz darstellt, beginnend am Anfang und endend an einer gegebenen Grenze.
2) views::take ist ein RangeAdaptorObject. Der Ausdruck views::take(e, f) ergibt eine View, die die ersten f Elemente aus e darstellt. Das Ergebnis ist nicht notwendigerweise eine take_view.

views::take(e, f) ist ausdrucksäquivalent zu (wobei T ist std::remove_cvref_t<decltype((e))> und D ist ranges::range_difference_t<decltype((e))>):

  • ((void)f, decay-copy(e)), wenn T eine ranges::empty_view ist, außer dass die Auswertungen von e und f unbestimmt sequenziert sind;
  • U(ranges::begin(e), ranges::begin(e) + std::min<D>(ranges::distance(e), f)), wenn T eine Spezialisierung von std::span, std::basic_string_view oder ranges::subrange ist, die sowohl random_access_range als auch sized_range modelliert, wobei U ist
  • std::span<typename T::element_type>, wenn T eine Spezialisierung von std::span ist;
  • T, wenn T eine Spezialisierung von std::basic_string_view ist;
  • ranges::subrange<ranges::iterator_t<T>>, wenn T eine Spezialisierung von ranges::subrange ist;
  • ranges::iota_view(*ranges::begin(e),
    *(ranges::begin(e) + std::min<D>(ranges::distance(e), f)))
    , wenn T eine Spezialisierung von ranges::iota_view ist, die sowohl random_access_range als auch sized_range modelliert;
  • views::repeat(*e.value_, std::min<D>(ranges::distance(e), f)), wenn T sized_range modelliert; in diesem Fall wird e nur einmal ausgewertet;
  • views::repeat(*e.value_, static_cast<D>(e)) andernfalls;
(seit C++23)
  • andernfalls, take_view(e, f).
In allen Fällen muss decltype((f)) std::convertible_to<D> modellieren.

take_view modelliert die Konzepte contiguous_range, random_access_range, bidirectional_range, forward_range, input_range und sized_range, wenn die zugrundeliegende View V die jeweiligen Konzepte modelliert. Sie modelliert common_range, wenn die zugrundeliegende View V sowohl random_access_range als auch sized_range modelliert.

Datenmitglieder

Member Beschreibung
V base_ die zugrundeliegende Ansicht
( Nur-Darstellungs-Memberobjekt* )
ranges:: range_difference_t < V > count_ die Anzahl der zu nehmenden Elemente
( Nur-Darstellungs-Memberobjekt* )

Memberfunktionen

konstruiert einen take_view
(öffentliche Elementfunktion)
gibt eine Kopie der zugrundeliegenden (adaptierten) Ansicht zurück
(öffentliche Elementfunktion)
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion)
gibt einen Iterator oder Sentinel zum Ende zurück
(öffentliche Elementfunktion)
gibt die Anzahl der Elemente zurück, bereitgestellt nur wenn der zugrundeliegende (adaptierte) Bereich sized_range erfüllt
(öffentliche Elementfunktion)
gibt die ungefähre Größe des resultierenden approximately_sized_range zurück
(öffentliche Elementfunktion)
Geerbt von ranges::view_interface
gibt zurück, ob die abgeleitete Ansicht leer ist, nur verfügbar, wenn sie sized_range oder forward_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
(C++23)
gibt einen Sentinel für den konstanten Iterator des Bereichs zurück
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, nur verfügbar, wenn ranges::empty auf sie anwendbar ist
(öffentliche Elementfunktion von std::ranges::view_interface<D>)
ermittelt die Adresse der Daten der abgeleiteten Ansicht, nur verfügbar, wenn ihr Iteratortyp contiguous_iterator
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt das erste Element in der abgeleiteten Ansicht zurück, verfügbar, wenn sie forward_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt das letzte Element in der abgeleiteten Ansicht zurück, nur verfügbar, wenn sie bidirectional_range und common_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)
gibt das nte Element in der abgeleiteten Ansicht zurück, nur verfügbar, wenn sie random_access_range
erfüllt (öffentliche Elementfunktion von std::ranges::view_interface<D>)

Deduktionshilfen

Geschachtelte Klassen

(C++20)
der Sentinel-Typ
( Nur zur Darstellung verwendete Member-Klassenvorlage* )

Hilfsvorlagen

template < class T >

constexpr bool enable_borrowed_range < std :: ranges :: take_view < T >> =

ranges:: enable_borrowed_range < T > ;
(seit C++20)

Diese Spezialisierung von ranges::enable_borrowed_range bewirkt, dass take_view borrowed_range erfüllt, wenn die zugrundeliegende View diese Bedingung erfüllt.

Beispiel

#include <algorithm>
#include <iostream>
#include <ranges>
int main()
{
    namespace views = std::views;
    auto print = [](char x){ std::cout << x; };
    for (const char nums[]{'1', '2', '3'};
         int n : views::iota(0, 5))
    {
        std::cout << "take(" << n << "): ";
        // safely takes only upto min(n, nums.size()) elements:
        std::ranges::for_each(nums | views::take(n), print);
        std::cout << '\n';
    }
}

Ausgabe:

take(0): 
take(1): 1
take(2): 12
take(3): 123
take(4): 123

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
LWG 3407 C++20 views::take konnte manchmal keinen
sized random access range konstruieren
Der Ergebnistyp wird angepasst, sodass
die Konstruktion immer gültig ist
LWG 3494 C++20 take_view war niemals ein borrowed_range Es ist ein borrowed_range wenn der zugrundeliegende View es ist

Siehe auch

erstellt einen Subrange aus einem Iterator und einer Anzahl
(Anpassungspunktobjekt)
eine view , bestehend aus den Anfangselementen einer anderen view , bis zum ersten Element, bei dem ein Prädikat false zurückgibt
(Klassentemplate) (Range-Adapterobjekt)
kopiert eine Anzahl von Elementen an einen neuen Speicherort
(Algorithmus-Funktionsobjekt)