Udostępnij za pośrednictwem


view_interface class (Standardowa biblioteka C++)

Klasa bazowa dla klas widoków w std::ranges przestrzeni nazw. Ta klasa implementuje niektóre interfejsy dla typów widoków pochodnych. Użyj tego jako klasy bazowej dla własnych typów widoków, aby zmniejszyć standardowy element, który należy zapisać.

Składnia

template<class Derived>
  requires std::is_class_v<Derived> && 
  std::same_as<Derived, std::remove_cv_t<Derived>>
class view_interface;

Parametry szablonu

Derived
Typ klasy pochodnej z tej klasy bazowej.

Elementy członkowskie

Funkcje składowe Opis
backC++20 Pobierz ostatni element w widoku pochodnym.
dataC++20 Pobierz wskaźnik do pierwszego elementu w widoku pochodnym.
emptyC++20 Sprawdź, czy widok pochodny jest pusty.
frontC++20 Pobierz pierwszy element w widoku pochodnym.
sizeC++20 Pobierz liczbę elementów w widoku pochodnym.
Operatory Opis
operator[]C++20 Pobierz element na określonej pozycji.
operator boolC++20 Sprawdź, czy widok pochodny nie jest pusty.

Wymagania

Nagłówek: <ranges> (od C++20)

Przestrzeń nazw: std::ranges

Opcja kompilatora: /std:c++20 lub nowsza jest wymagana.

back

Pobierz ostatni element w widoku pochodnym.

constexpr auto back()
    requires ranges::bidirectional_range<Derived> &&
    ranges::common_range<Derived>;

constexpr auto back() const
    requires ranges::bidirectional_range<const Derived> && 
    ranges::common_range<const Derived>;

Parametry

Brak.

Wartość zwracana

Ostatni element w widoku pochodnym.

Uwagi

Widok pochodny musi spełniać bidirectional_range wymagania i common_range.
Zachowanie elementu back() i front() jest niezdefiniowane dla dowolnego pustego widoku.

data

Pobierz wskaźnik do pierwszego elementu w widoku pochodnym.

constexpr auto data()
    requires std::contiguous_iterator<ranges::iterator_t<Derived>>;
constexpr auto data() const
    requires ranges::range<const Derived> &&
    std::contiguous_iterator<ranges::iterator_t<const Derived>>;

Parametry

Brak.

Wartość zwracana

Wskaźnik do pierwszego elementu w widoku pochodnym.

Uwagi

Iterator widoku pochodnego musi spełniać wartość contiguous_iterator.

empty

Sprawdź, czy widok pochodny jest pusty.

1) constexpr bool empty() requires ranges::forward_range<Derived>;
2) constexpr bool empty() const requires ranges::forward_range<const Derived>;

Parametry

Brak.

Wartość zwracana

Zwraca wartość true , jeśli widok pochodny nie ma żadnych elementów. W przeciwnym razie zwraca wartość false.

Uwagi

Widok pochodny musi spełniać wartość std::ranges::forward_range.

front

Pobierz pierwszy element w widoku pochodnym.

constexpr auto front()
    requires ranges::forward_range<Derived>;
constexpr auto front() const
    requires ranges::forward_range<const Derived>;

Parametry

Brak.

Wartość zwracana

Ostatni element w widoku pochodnym.

Uwagi

Widok pochodny musi spełniać wartość forward_range.
Zachowanie elementu front() jest niezdefiniowane dla elementu std::ranges::empty_view.

size

Pobierz liczbę elementów w widoku pochodnym.

constexpr auto size() requires ranges::forward_range<Derived> &&
    std::sized_sentinel_for<ranges::sentinel_t<Derived>,
    ranges::iterator_t<Derived>>;
constexpr auto size() const requires ranges::forward_range<const Derived> &&
    std::sized_sentinel_for<ranges::sentinel_t<const Derived>,
    ranges::iterator_t<const Derived>>;

Parametry

Brak.

Wartość zwracana

Liczba elementów w widoku pochodnym.

Uwagi

Iterator widoku pochodnego musi spełniać wartość sized_sentinel_for.

operator[]

Pobierz element na określonej pozycji.

template<ranges::random_access_range R = Derived>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos);

template<ranges::random_access_range R = const Derived>
constexpr decltype(auto) operator[](ranges::range_difference_t<R> pos) const;

Parametry

pos
Pozycja względem iteratora początkowego elementu do zwrócenia.

Wartość zwracana

Element na określonej pozycji względem iteratora początkowego.

Uwagi

Widok pochodny musi spełniać wartość random_access_range.
Zachowanie tego operatora jest niezdefiniowane dla elementu std::ranges::empty_view.

Przykład: operator[]

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};
    std::ranges::drop_view dv = std::views::drop(v, 2);

    for (auto e : dv)
    {
        std::cout << e << ' '; // 3 4 5
    }

    std::cout << "\ndv[1] = " << dv[1];
}
3 4 5
dv[1] = 4

view_interface::operator bool

Sprawdź, czy widok pochodny nie jest pusty.

explicit constexpr operator bool();
explicit constexpr operator bool() const;

Parametry

Brak.

Wartość zwracana

Zwraca wartość false , jeśli widok pochodny nie ma żadnych elementów (widok jest pusty). W przeciwnym razie zwraca wartość true (widok nie jest pusty).

Uwagi

Iterator widoku pochodnego musi spełniać wartość std::ranges::forward_iterator.
Ten operator jest odpowiednikiem !empty(). Ułatwia to pisanie if (someRange) {...} w celu przetestowania, czy istnieje coś w zakresie do działania.
Zachowanie tego operatora jest niezdefiniowane dla elementu std::ranges::empty_view.

Przykład: operator bool

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};
    std::ranges::filter_view fv = std::views::filter(v, [](int e) { return e > 3; });

    bool isNotEmpty = static_cast<bool>(fv);
    std::cout << "Has elements greater than 3: " << std::boolalpha << isNotEmpty << '\n' >>;
}
Has elements greater than 3: true

Zobacz też

<ranges>
ranges::begin()
ranges::data()
ranges::end()
ranges::empty()
ranges::size()
Klasy widoków