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,
decay-copy(e)),如果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) |
將一定數量的元素複製到一個新位置 (演算法函式物件) |