std::ranges::views::drop, std::ranges::drop_view
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< ranges::view V > class drop_view |
(1) | (C++20 起) |
namespace views { inline constexpr /* unspecified */ drop = /* unspecified */; |
(2) | (C++20 起) |
呼叫簽名 (Call signature) |
||
template< ranges::viewable_range R > requires /* 見下文 */ |
(C++20 起) | |
template< class DifferenceType > constexpr /* range adaptor closure */ drop( DifferenceType&& count ); |
(C++20 起) | |
1) 一個範圍介面卡,由底層序列的元素組成,跳過前 N 個元素。
2) RangeAdaptorObject。給定
T
為 std::remove_cvref_t<decltype((e))> 且 D
為 ranges::range_difference_t<decltype((e))>,表示式 views::drop(e, f) 表示式等價於- ((void)f,
T
是 ranges::empty_view,除了 e 和 f 的求值順序不確定之外; - 否則,如果
T
是 ranges::subrange 的特化,它同時模型random_access_range
和sized_range
,並且T
需要儲存大小(詳見 ranges::subrange::subrange()),則為 T(ranges::begin(e) + inc, ranges::end(e),
/*to-unsigned-like*/(ranges::distance(e) - inc)),其中 inc 是 std::min<D>(ranges::distance(e), f); - 否則,如果
T
是 std::span、std::basic_string_view、ranges::iota_view 或 ranges::subrange 的特化,它同時模型random_access_range
和sized_range
,則為 U(ranges::begin(e) + inc, ranges::end(e)),其中U
是
|
(C++23 起) |
- 否則為 drop_view(e, f)。
drop_view
在底層檢視 V
模型相應概念時,模型概念 contiguous_range
、random_access_range
、bidirectional_range
、forward_range
、input_range
、common_range
和 sized_range
。
目錄 |
[編輯] 資料成員
成員 | 描述 |
V base_ (私有) |
底層檢視 (僅用於闡釋的成員物件*) |
ranges::range_difference_t<V> count_ (私有) |
要跳過的元素數量 (僅用於闡釋的成員物件*) |
non-propagating-cache<ranges::iterator_t<V>> cache_ (私有)(僅當 V 滿足 forward_range 但不滿足 random_access_range 和 sized_range 時存在)
|
一個快取 begin() 呼叫結果的物件(僅用於闡釋的成員物件*) |
[編輯] 成員函式
構造 drop_view (公共成員函式) | |
返回底層(適配)檢視的副本 (公共成員函式) | |
返回指向起始的迭代器 (公共成員函式) | |
返回一個迭代器或一個哨兵到末尾 (公共成員函式) | |
返回元素數量,僅當底層(適配的)範圍滿足 sized_range 時提供(公共成員函式) | |
繼承自 std::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 的特化使得 drop_view
在底層檢視滿足 borrowed_range
時也滿足該概念。
[編輯] 示例
執行此程式碼
#include <iostream> #include <ranges> int main() { const auto nums = {1, 2, 3, 4, 5, 6, 7}; std::cout << "drop " << 2 << ": "; for (int i : std::ranges::drop_view{nums, 2}) std::cout << i << ' '; std::cout << '\n'; std::cout << "drop " << 3 << ": "; for (int i : nums | std::views::drop(3)) std::cout << i << ' '; std::cout << '\n'; std::cout << "drop " << 4 << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(4)) std::cout << i << ' '; std::cout << '\n'; // Note that dropping more than the number of elements is OK: for (int dp : {5, 6, 7, 890, 100500}) { std::cout << "drop " << dp << ": "; for (int i : std::views::iota(1, 8) | std::views::drop(dp)) std::cout << i << ' '; std::cout << '\n'; } }
輸出
drop 2: 3 4 5 6 7 drop 3: 4 5 6 7 drop 4: 5 6 7 drop 5: 6 7 drop 6: 7 drop 7: drop 890: drop 100500:
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3407 | C++20 | views::drop 有時無法構造一個帶大小的隨機訪問範圍 |
已調整構造方式 使其始終有效 |
LWG 3494 | C++20 | drop_view 從未成為 borrowed_range |
如果其底層檢視是 borrowed_range ,則它也是 borrowed_range |
[編輯] 參閱
一個 view ,由另一個 view 的元素組成,跳過初始的元素子序列,直到第一個謂詞返回 false 的元素(類模板) (範圍介面卡物件) |