Namensräume
Varianten
Aktionen

std::ranges::views::enumerate, std::ranges::enumerate_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
 
Definiert in der Header-Datei <ranges>
template< ranges::view V >

    requires /*bereich-mit-bewegbaren-referenzen*/<V>
class enumerate_view

    : public ranges::view_interface<enumerate_view<V>>
(1) (seit C++23)
namespace views {

    inline constexpr /* nicht spezifiziert */ enumerate = /* nicht spezifiziert */;

}
(2) (seit C++23)
Aufruf-Signatur
template< ranges::viewable_range R >

    requires /* siehe unten */

constexpr /* siehe unten */ enumerate( R&& r );
(seit C++23)
Hilfskonzepte
template< class R >

    concept /*bereich-mit-bewegbaren-referenzen*/ =
        ranges::input_range<R> &&
        std::move_constructible<ranges::range_reference_t<R>> &&

        std::move_constructible<ranges::range_rvalue_reference_t<R>>;
(3) (nur Exposition*)
1) enumerate_view ist ein Range-Adapter, der eine view annimmt und eine View von tuples erzeugt. Das i-te Element (das Tupel) der resultierenden Sequenz enthält
  • den Wert i, der ein nullbasierter Index des Elements der zugrundeliegenden Sequenz ist, und
  • die Referenz auf das zugrundeliegende Element.
2) Der Name views::enumerate bezeichnet ein RangeAdaptorObject. Bei einem Unterausdruck e ist der Ausdruck views::enumerate(e) ausdrucksäquivalent zu enumerate_view<views::all_t<decltype((e))>>(e) für jeden geeigneten Unterausdruck e.
3) Stellt sicher, dass der Referenztyp des zugrundeliegenden Typs bewegt werden kann.

enumerate_view modelliert die Konzepte random_access_range, bidirectional_range, forward_range, input_range, common_range und sized_range, wenn die zugrundeliegende View V die entsprechenden Konzepte modelliert.

Inhalt

[bearbeiten] Datenmitglieder

Member-Name Definition
base_ (privat) Ein Iterator zur zugrundeliegenden Sequenz vom Typ V.
((exposition-only member object*)

[bearbeiten] Member-Funktionen

konstruiert eine enumerate_view
(öffentliche Member-Funktion) [edit]
gibt eine Kopie der zugrunde liegenden (angepassten) View zurück
(public member function) [edit]
gibt einen Iterator zum Anfang zurück
(öffentliche Member-Funktion) [edit]
gibt einen Iterator oder Sentinel zum Ende zurück
(öffentliche Member-Funktion) [edit]
gibt die Anzahl der Elemente zurück, nur bereitgestellt, wenn die zugrunde liegende (adaptierte) Range sized_range erfüllt
(öffentliche Member-Funktion) [edit]
Geerbt von std::ranges::view_interface
gibt zurück, ob die abgeleitete Ansicht leer ist, bereitgestellt nur, wenn sie sized_range oder forward_range erfüllt
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist
(public member function of std::ranges::view_interface<D>) [edit]
gibt das erste Element in der abgeleiteten View zurück, bereitgestellt, wenn sie forward_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das letzte Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie bidirectional_range und common_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das n-te Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie random_access_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]

[bearbeiten] Deduktionshilfen

[bearbeiten] Verschachtelte Klassen

(C++23)
der Iterator-Typ
((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*)
(C++23)
der Sentinel-Typ
((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*)

[bearbeiten] Hilfsschablonen

template< class View >

constexpr bool enable_borrowed_range<ranges::enumerate_view<View>> =

    ranges::enable_borrowed_range<View>;
(seit C++23)

Diese Spezialisierung von ranges::enable_borrowed_range sorgt dafür, dass enumerate_view borrowed_range erfüllt, wenn die zugrundeliegende View dies erfüllt.

[bearbeiten] Anmerkungen

Feature-Test-Makro Wert Std Feature
__cpp_lib_ranges_enumerate 202302L (C++23) std::ranges::enumerate_view

[bearbeiten] Beispiel

#include <iostream>
#include <map>
#include <ranges>
#include <vector>
 
int main()
{
    constexpr static auto v = {'A', 'B', 'C', 'D'};
 
    for (auto const [index, letter] : std::views::enumerate(v))
        std::cout << '(' << index << ':' << letter << ") ";
    std::cout << '\n';
 
#if __cpp_lib_ranges_to_container
    // create a map using the position of each element as key
    auto m = v | std::views::enumerate | std::ranges::to<std::map>();
 
    for (auto const [key, value] : m)
        std::cout << '[' << key << "]:" << value << ' ';
    std::cout << '\n';
#endif
 
    std::vector<int> numbers{1, 3, 5, 7};
 
    // num is mutable even with const, which does not propagate to reference to
    // make it const, use `std::views::enumerate(numbers) | std::views::as_const`
    // or `std::views::enumerate(std::as_const(numbers))`
    for (auto const [index, num] : std::views::enumerate(numbers))
    {
        ++num; // the type is int&
        std::cout << numbers[index] << ' ';
    }
    std::cout << '\n';
}

Mögliche Ausgabe

(0:A) (1:B) (2:C) (3:D)
[0]:A [1]:B [2]:C [3]:D
2 4 6 8

[bearbeiten] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 26.7.23 Enumerate view [range.enumerate]

[bearbeiten] Siehe auch

ein view, der eine Sequenz aus aufeinanderfolgenden Inkrementierungen eines Anfangswerts besteht
(Klassen-Template) (Customization Point Objekt)[edit]
ein view, der aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views besteht
(Klassen-Template) (Customization Point Objekt)[edit]
nimmt einen view von tuple-ähnlichen Werten und eine Zahl N und erzeugt einen view des N-ten Elements jedes Tupels
(Klassen-Template) (Range-Adaptor-Objekt)[edit]