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
派生自此基类的类的类型。
成员
成员函数 | 描述 |
---|---|
back C++20 |
获取派生视图中的最后一个元素。 |
data C++20 |
获取指向派生视图中第一个元素的指针。 |
empty C++20 |
测试派生视图是否为空。 |
front C++20 |
获取派生视图中的第一个元素。 |
size C++20 |
获取派生视图中的元素数。 |
运算符 | 描述 |
operator[] C++20 |
获取指定位置的元素。 |
operator bool C++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_range
和 common_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()
视图类