view_interface 类(C++ 标准库)

std::ranges 命名空间中视图类的基类。 此类实施派生视图类型的一些接口。 将此类用作你自己的视图类型的基类,以减少需要写入的样本。

语法

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

模板参数

Derived
派生自此基类的类的类型。

成员

成员函数 描述
backC++20 获取派生视图中的最后一个元素。
dataC++20 获取指向派生视图中第一个元素的指针。
emptyC++20 测试派生视图是否为空。
frontC++20 获取派生视图中的第一个元素。
sizeC++20 获取派生视图中的元素数。
运算符 描述
operator[]C++20 获取指定位置的元素。
operator boolC++20 测试派生视图是否不为空。

要求

标头: <ranges> (自C++20以来)

命名空间std::ranges

编译器选项:/std:c++20或更高版本是必需的。

back

获取派生视图中的最后一个元素。

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>;

参数

无。

返回值

派生视图中的最后一个元素。

备注

派生视图必须满足 bidirectional_rangecommon_range 要求。
对于任何空视图,未定义 back()front() 的行为。

data

获取指向派生视图中第一个元素的指针。

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>>;

参数

无。

返回值

指向派生视图中第一个元素的指针。

备注

派生视图的迭代器必须满足 contiguous_iterator 要求。

empty

测试派生视图是否为空。

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

参数

无。

返回值

如果派生视图不包含任何元素,则返回 true。 否则返回 false

备注

派生视图必须满足 std::ranges::forward_range 要求。

front

获取派生视图中的第一个元素。

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

参数

无。

返回值

派生视图中的最后一个元素。

注解

派生视图必须满足 forward_range 要求。
未为 std::ranges::empty_view 定义 front() 的行为。

size

获取派生视图中的元素数。

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>>;

参数

无。

返回值

派生视图中的元素数。

注解

派生视图的迭代器必须满足 sized_sentinel_for 要求。

operator[]

获取指定位置的元素。

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;

参数

pos
要返回的元素相对于起始迭代器的位置。

返回值

相对于起始迭代器的指定位置处的元素。

注解

派生视图必须满足 random_access_range 要求。
未为 std::ranges::empty_view 定义此运算符的行为。

示例: 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

测试派生视图是否不为空。

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

参数

无。

返回值

如果派生视图不包含任何元素(视图为空),则返回 false。 否则,返回 true(视图不为空)。

注解

派生视图的迭代器必须满足 std::ranges::forward_iterator 要求。
此运算符等效于 !empty()。 这样,可以方便地写入 if (someRange) {...} 以测试区域中是否有要运算的内容。
未为 std::ranges::empty_view 定义此运算符的行为。

示例: 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

另请参阅

<ranges>
ranges::begin()
ranges::data()
ranges::end()
ranges::empty()
ranges::size()
视图类