std::ranges::views::drop, std::ranges::drop_view
| 在头文件中定义 <ranges>
|
||
template< ranges::view V >
class drop_view
: public ranges::view_interface<drop_view<V>>
|
(1) | (自 C++20 起) |
namespace views {
inline constexpr /* unspecified */ drop = /* unspecified */;
}
|
(2) | (自 C++20 起) |
| 调用签名 |
||
template< ranges::viewable_range R >
requires /* see below */
constexpr ranges::view auto
drop( R&& r, ranges::range_difference_t<R> count );
|
(自 C++20 起) | |
template< class DifferenceType >
constexpr /* range adaptor closure */ drop( DifferenceType&& count );
|
(自 C++20 起) | |
T 是 std::remove_cvref_t<decltype((e))> 且 D 是 ranges::range_difference_t<decltype((e))>),表达式 views::drop(e, f) 是表达式等价于:((void)f,decay-copy(e)),如果T是一个 ranges::empty_view,但e和f的求值顺序是不确定的;- 否则,
T(ranges::begin(e) + inc, ranges::end(e),/*to-unsigned-like*/(ranges::distance(e) - inc)),如果T是ranges::subrange的特化,且同时满足 random_access_range 和 sized_range,并且T需要存储大小(详情见 ranges::subrange::subrange()),其中inc是std::min<D>(ranges::distance(e), f); - 否则,
U(ranges::begin(e) + inc, ranges::end(e)),如果T是std::span、std::basic_string_view、ranges::iota_view或ranges::subrange的特化,且同时满足 random_access_range 和 sized_range,其中U是
std::span<typename T::element_type>,如果T是std::span的特化;T否则;
|
(自 C++23 起) |
- 否则,
drop_view(e, f)。
decltype((f)) 必须满足 std::convertible_to<D>。drop_view满足概念 contiguous_range、random_access_range、bidirectional_range、forward_range、input_range、common_range 和 sized_range,当底层视图 V 分别满足这些概念时。
数据成员
| 成员 | 描述 |
V base_ (private)
|
底层视图 (exposition-only member object*) |
ranges::range_difference_t<V> count_ (private)
|
要跳过的元素数量 (exposition-only member object*) |
non-propagating-cache<ranges::iterator_t<V>> cache_ (private) (仅在 V 满足 forward_range但不满足 random_access_range 和 sized_range 时存在) |
一个对象,缓存对 begin()的调用结果(exposition-only member object*) |
成员函数
构造一个
drop_view
(公开成员函数) |
|
|
返回底层(适配的)视图的副本
(公开成员函数) |
|
|
返回指向起始位置的迭代器
(公开成员函数) |
|
|
返回指向末尾位置的迭代器或哨兵
(公开成员函数) |
|
返回元素数量,仅当底层(适配的)范围满足
sized_range
时提供
(公开成员函数) |
|
|
(C++26)
|
返回生成的
approximately_sized_range
的近似大小
(公开成员函数) |
继承自 ranges::view_interface | |
| 返回派生视图是否为空,仅在满足 sized_range 或 forward_range 时提供( std::ranges::view_interface<D> 的公开成员函数)
| |
(C++23) |
返回指向范围起始的常量迭代器 ( std::ranges::view_interface<D> 的公开成员函数)
|
(C++23) |
返回范围常量迭代器的哨位 ( std::ranges::view_interface<D> 的公开成员函数)
|
| 返回派生视图是否不为空,仅在 ranges::empty 可应用于它时提供 ( std::ranges::view_interface<D> 的公开成员函数)
| |
| 获取派生视图数据的地址,仅在迭代器类型满足 contiguous_iterator 时提供( std::ranges::view_interface<D> 的公开成员函数)
| |
| 返回派生视图中的第一个元素,在满足 forward_range 时提供( std::ranges::view_interface<D> 的公开成员函数)
| |
| 返回派生视图中的最后一个元素,仅在满足 bidirectional_range 和 common_range 时提供( std::ranges::view_interface<D> 的公开成员函数)
| |
返回派生视图中第 n个 元素,仅在满足 random_access_range 时提供( std::ranges::view_interface<D> 的公开成员函数)
| |
推导指引
辅助模板
|
template
<
class
T
>
constexpr
bool
enable_borrowed_range
<
std
::
ranges
::
drop_view
<
T
>>
=
|
(C++20 起) | |
此
ranges::enable_borrowed_range
的特化使得当底层视图满足
borrowed_range
时,
drop_view
也满足
borrowed_range
。
示例
#include <initializer_list> #include <iostream> #include <ranges> int main() { const auto nums = {1, 2, 3, 4, 5, 6, 7}; std::cout << "丢弃 " << 2 << ": "; for (int i : std::ranges::drop_view{nums, 2}) std::cout << i << ' '; std::cout << '\n'; std::cout << "丢弃 " << 3 << ": "; for (int i : nums | std::views::drop(3)) std::cout << i << ' '; std::cout << '\n'; std::cout << "丢弃 " << 4 << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(4)) std::cout << i << ' '; std::cout << '\n'; // 注意:丢弃超过元素数量是安全的: for (int dp : {5, 6, 7, 890, 100500}) { std::cout << "丢弃 " << dp << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(dp)) std::cout << i << ' '; std::cout << '\n'; } }
输出:
丢弃 2: 3 4 5 6 7 丢弃 3: 4 5 6 7 丢弃 4: 5 6 7 丢弃 5: 6 7 丢弃 6: 7 丢弃 7: 丢弃 890: 丢弃 100500:
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 修正后行为 |
|---|---|---|---|
| LWG 3407 | C++20 |
views::drop
有时无法
构造大小确定的随机访问范围 |
调整构造方式
使其始终有效 |
| LWG 3494 | C++20 |
drop_view
从未是
borrowed_range
|
当底层视图是
borrowed_range
时
它也是
borrowed_range
|
参见
一个由另一个
view
的元素组成的
view
,跳过元素的初始子序列直到首个谓词返回
false
的元素
(类模板) (范围适配器对象) |