std::ranges::views::adjacent, std::ranges::adjacent_view, std::ranges::views::pairwise
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< ranges::forward_range V, std::size_t N > requires ranges::view<V> && (N > 0) |
(1) | (C++23 起) |
namespace views { template< std::size_t N > |
(2) | (C++23 起) |
namespace views { inline constexpr auto pairwise = adjacent<2>; |
(3) | (C++23 起) |
呼叫簽名 (Call signature) |
||
template< ranges::viewable_range R > requires /* 見下文 */ |
(C++23 起) | |
1)
adjacent_view
是一個範圍介面卡,它接受一個 view
,並生成一個 view
,其第 i
個元素(一個“視窗”)是一個 std::tuple,其中包含對原始檢視元素的 N
個引用,從第 i
個到第 i + N - 1 個(含)。 令
S
為原始檢視的大小。則生成檢視的大小為- S - N + 1,如果
S >= N
, - 0 否則,且結果檢視為空。
2) 名稱 views::adjacent<N> 表示一個 RangeAdaptorObject。給定子表示式 e 和常量表達式 N,表示式 views::adjacent<N>(e) 在 表示式等價 於
- ((void)e, auto(views::empty<tuple<>>)),如果 N 等於 0 且 decltype((e)) 建模
forward_range
, - adjacent_view<views::all_t<decltype((e))>, N>(e) 否則。
adjacent_view
始終模型 forward_range
,並且當其所適配的 view
型別模型相應的概念時,它也模型 bidirectional_range
、random_access_range
或 sized_range
。
目錄 |
[編輯] 資料成員
成員名稱 (Member name) | 定義 |
base_ (私有) |
型別為 V 的底層 view 。(僅用於闡釋的成員物件*) |
[編輯] 成員函式
構造一個 adjacent_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> 的公共成員函式) | |
返回派生檢視中的第一個元素,如果它滿足 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> 的公共成員函式) |
[編輯] 推導指南
(無)
[編輯] 巢狀類
迭代器型別 (僅用於說明的成員類模板*) | |
當 adjacent_view 不是 common_range 時使用的哨兵型別(僅用於說明的成員類模板*) |
[編輯] 輔助模板
template< class V, size_t N > constexpr bool ranges::enable_borrowed_range<adjacent_view<V, N>> = |
(C++23 起) | |
ranges::enable_borrowed_range 的此特化使得 adjacent_view
在底層檢視滿足此條件時也滿足 borrowed_range
。
[編輯] 注意
views::adjacent 僅接受前向範圍,即使 N
為 0
。
ranges::adjacent_view 和 ranges::slide_view 之間存在相似之處
- 兩者都建立大小為
N
的“滑動視窗”。 - 兩者都具有相同的大小
S - N + 1
,其中S
是適配的view
的大小,使得S >= N > 0
。
下表顯示了這些介面卡之間的差異
檢視介面卡 (View adaptor) | value_type |
視窗大小 N (The window size N ) |
---|---|---|
ranges::adjacent_view | std::tuple | 一個模板引數 (A template parameter) |
ranges::slide_view | ranges::range | 一個執行時引數 (A runtime argument) |
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_ranges_zip |
202110L |
(C++23) | ranges::zip_view, ranges::zip_transform_view, ranges::adjacent_view ,ranges::adjacent_transform_view |
[編輯] 示例
執行此程式碼
#include <array> #include <format> #include <iostream> #include <ranges> #include <tuple> int main() { constexpr std::array v{1, 2, 3, 4, 5, 6}; std::cout << "v = [1 2 3 4 5 6]\n"; for (int i{}; std::tuple t : v | std::views::adjacent<3>) { auto [t0, t1, t2] = t; std::cout << std::format("e = {:<{}}[{} {} {}]\n", "", 2 * i++, t0, t1, t2); } }
輸出
v = [1 2 3 4 5 6] e = [1 2 3] e = [2 3 4] e = [3 4 5] e = [4 5 6]
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 4098 | C++23 | views::adjacent<0> 曾接受僅輸入範圍 | 已拒絕 |
[編輯] 參考
- C++23 標準 (ISO/IEC 14882:2024)
- 26.7.25 相鄰檢視 [range.adjacent]
[編輯] 另請參閱
一個 view ,由對適配檢視的相鄰元素應用轉換函式的結果組成(類模板) (範圍介面卡物件) | |
一個 view ,其第 M 個元素是另一個 view 中第 M 個到第 (M + N - 1) 個元素的 view (類模板) (範圍介面卡物件) | |
一個 view 的範圍,它是另一個 view 元素的 N 大小的非重疊連續塊(類模板) (範圍介面卡物件) | |
一個 view ,由另一個 view 的元素組成,每次前進 N 個元素(類模板) (範圍介面卡物件) |