std::ranges::views::reverse, std::ranges::reverse_view
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< ranges::view V > requires ranges::bidirectional_range<V> |
(1) | (C++20 起) |
namespace views { inline constexpr /* unspecified */ reverse = /* unspecified */; |
(2) | (C++20 起) |
呼叫簽名 (Call signature) |
||
template< ranges::viewable_range R > requires /* 見下文 */ |
(C++20 起) | |
1) 一個範圍介面卡,它表示底層
view
的反向檢視。2) RangeAdaptorObject。表示式 views::reverse(e) 在表示式等價於以下表達式之一,除了 e 只會被求值一次
- e.base(),如果
e
的型別是reverse_view
的(可能帶 cv 限定符的)特化; - 否則,如果 e 的型別是(可能帶 cv 限定符的)ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K>,對於某些迭代器型別
I
和ranges::subrange_kind
型別的值K
- ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()),如果
K
是ranges::subrange_kind::sized
; - 否則 ranges::subrange<I, I, K>(e.end().base(), e.begin().base());
- ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()),如果
- 否則 ranges::reverse_view{e}。
views::reverse
儘可能地展開反向檢視。reverse_view
總是模型化 bidirectional_range
和 common_range
,並且如果底層檢視型別 V
模型化相應的概念,它還會模型化 borrowed_range
、sized_range
或 random_access_range
。
目錄 |
[編輯] 資料成員
成員 | 描述 |
V base_ (私有) |
底層檢視 (僅用於闡釋的成員物件*) |
non-propagating-cache<ranges::iterator_t<V>> cached_end_ (私有)(僅當 V 不滿足 common_range 時存在)
|
一個快取 begin() 呼叫結果的物件(僅用於闡釋的成員物件*) |
[編輯] 成員函式
構造一個 reverse_view (公開成員函式) | |
返回底層檢視 V (公開成員函式) | |
返回 reverse_view 的起始迭代器(公開成員函式) | |
返回 reverse_view 的結束迭代器(公開成員函式) | |
如果檢視有界,則返回檢視的大小 (公開成員函式) | |
繼承自 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> 的公共成員函式) |
std::ranges::reverse_view::reverse_view
reverse_view() requires std::default_initializable<V> = default; |
(1) | (C++20 起) |
constexpr reverse_view( V r ); |
(2) | (C++20 起) |
1) 透過其預設成員初始化器(= V())對
base_
進行值初始化。2) 用 std::move(r) 初始化
base_
。引數
r | - | 要反轉的範圍 |
std::ranges::reverse_view::base
constexpr V base() const& requires std::copy_constructible<V>; |
(1) | (C++20 起) |
constexpr V base() &&; |
(2) | (C++20 起) |
返回底層檢視。
1) 從底層檢視複製構造結果。等價於 return base_;。
2) 從底層檢視移動構造結果。等價於 return std::move(base_);。
std::ranges::reverse_view::begin
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin(); |
(1) | (C++20 起) |
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin() requires ranges::common_range<V>; |
(2) | (C++20 起) |
constexpr auto begin() const requires ranges::common_range<const V>; |
(3) | (C++20 起) |
1) 返回 std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_)))。為了提供
range
概念所要求的攤銷常數時間複雜度,此函式會在快取物件中快取結果,以供後續呼叫使用。2,3) 等價於 return std::make_reverse_iterator(ranges::end(base_));。
std::ranges::reverse_view::end
constexpr std::reverse_iterator<ranges::iterator_t<V>> end(); |
(1) | (C++20 起) |
constexpr auto end() const requires ranges::common_range<const V>; |
(2) | (C++20 起) |
等價於 return std::make_reverse_iterator(ranges::begin(base_));。
std::ranges::reverse_view::size
constexpr auto size() requires ranges::sized_range<V>; |
(1) | (C++20 起) |
constexpr auto size() const requires ranges::sized_range<const V>; |
(2) | (C++20 起) |
如果檢視有界,則返回檢視的大小。
1,2) 等價於 return ranges::size(base_);。
[編輯] 推導指南
template< class R > reverse_view( R&& ) -> reverse_view<views::all_t<R>>; |
(C++20 起) | |
[編輯] 輔助模板
template< class T > constexpr bool enable_borrowed_range<std::ranges::reverse_view<T>> = |
(C++20 起) | |
此 std::ranges::enable_borrowed_range 的特化使得 reverse_view
在底層檢視滿足 borrowed_range
時也滿足該概念。
[編輯] 示例
執行此程式碼
#include <iostream> #include <ranges> int main() { static constexpr auto il = {3, 1, 4, 1, 5, 9}; std::ranges::reverse_view rv{il}; for (int i : rv) std::cout << i << ' '; std::cout << '\n'; for (int i : il | std::views::reverse) std::cout << i << ' '; std::cout << '\n'; // operator[] is inherited from std::view_interface for (auto i{0U}; i != rv.size(); ++i) std::cout << rv[i] << ' '; std::cout << '\n'; }
輸出
9 5 1 4 1 3 9 5 1 4 1 3 9 5 1 4 1 3
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3494 | C++20 | reverse_view 從未是 borrowed_range |
如果其底層檢視是 borrowed_range ,則它也是 borrowed_range |
[編輯] 參閱
用於反向遍歷的迭代器介面卡 (類模板) | |
(C++20) |
反轉一個範圍中元素的順序 (演算法函式物件) |
(C++20) |
建立一個反轉後的範圍副本 (演算法函式物件) |