std::ranges::views::take, std::ranges::take_view
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< ranges::view V > class take_view |
(1) | (C++20 起) |
namespace views { inline constexpr /* unspecified */ take = /* unspecified */; |
(2) | (C++20 起) |
呼叫簽名 (Call signature) |
||
template< ranges::viewable_range R > requires /* 見下文 */ |
(C++20 起) | |
template< class DifferenceType > constexpr /* range adaptor closure */ take( DifferenceType&& count ); |
(C++20 起) | |
1) 一個範圍介面卡,表示一個底層序列中從頭開始並以給定邊界結束的元素
view
。2)
views::take
是一個 RangeAdaptorObject。表示式 views::take(e, f) 產生一個檢視,表示 e 中的前 f 個元素。結果不一定是 take_view
。views::take(e, f) 表示式等價於(其中 T
是 std::remove_cvref_t<decltype((e))>,D
是 ranges::range_difference_t<decltype((e))>)
- ((void)f,
T
是 ranges::empty_view,但 e 和 f 的求值順序不確定; - U(ranges::begin(e), ranges::begin(e) + std::min<D>(ranges::distance(e), f)),如果
T
是 std::span、std::basic_string_view 或 ranges::subrange 的特化,並且它同時模型random_access_range
和sized_range
,其中U
是
- std::span<typename T::element_type>,如果
T
是 std::span 的特化; -
T
,如果T
是 std::basic_string_view 的特化; - ranges::subrange<ranges::iterator_t<T>>,如果
T
是 ranges::subrange 的特化;
- std::span<typename T::element_type>,如果
- ranges::iota_view(*ranges::begin(e),
*(ranges::begin(e) + std::min<D>(ranges::distance(e), f))),如果T
是 ranges::iota_view 的特化,並且它同時模型random_access_range
和sized_range
;
|
(C++23 起) |
- 否則,take_view(e, f)。
當底層檢視 V
模型相應的概念時,take_view
模型 contiguous_range
、random_access_range
、bidirectional_range
、forward_range
、input_range
和 sized_range
等概念。當底層檢視 V
同時模型 random_access_range
和 sized_range
時,它模型 common_range
。
目錄 |
[編輯] 資料成員
成員 | 描述 |
V base_ (私有) |
底層檢視 (僅用於闡釋的成員物件*) |
ranges::range_difference_t<V> count_ (私有) |
要獲取的元素數量 (僅用於闡釋的成員物件*) |
[編輯] 成員函式
構造一個 take_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> 的公共成員函式) |
[編輯] 推導指南
[編輯] 巢狀類
(C++20) |
哨兵型別 (僅用於說明的成員類模板*) |
[編輯] 輔助模板
template< class T > constexpr bool enable_borrowed_range<std::ranges::take_view<T>> = |
(C++20 起) | |
此 std::ranges::enable_borrowed_range 的特化使得 take_view
在底層檢視滿足時也滿足 borrowed_range
。
[編輯] 示例
執行此程式碼
#include <algorithm> #include <iostream> #include <ranges> int main() { namespace views = std::views; auto print = [](char x){ std::cout << x; }; for (const char nums[]{'1', '2', '3'}; int n : views::iota(0, 5)) { std::cout << "take(" << n << "): "; // safely takes only upto min(n, nums.size()) elements: std::ranges::for_each(nums | views::take(n), print); std::cout << '\n'; } }
輸出
take(0): take(1): 1 take(2): 12 take(3): 123 take(4): 123
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3407 | C++20 | views::take 有時無法構造大小已知的隨機訪問範圍 |
調整了結果型別,以便 構造總是有效的 |
LWG 3494 | C++20 | take_view 從未成為 borrowed_range |
如果其底層檢視是 borrowed_range ,則它也是 borrowed_range |
[編輯] 參閱
(C++20) |
從迭代器和計數建立子範圍 (自定義點物件) |
一個 view ,由另一個 view 的初始元素組成,直到第一個謂詞返回 false 的元素(類模板) (範圍介面卡物件) | |
(C++20) |
將一定數量的元素複製到一個新位置 (演算法函式物件) |