std::ranges::views::join, std::ranges::join_view
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< ranges::input_range V > requires ranges::view<V> and |
(1) | (C++20 起) |
namespace views { inline constexpr /* unspecified */ join = /* unspecified */; |
(2) | (C++20 起) |
呼叫簽名 (Call signature) |
||
template< ranges::viewable_range R > requires /* 見下文 */ |
(C++20 起) | |
1) 一個範圍介面卡,表示由扁平化範圍檢視獲得的序列組成的
view
。2) 範圍介面卡物件(也是範圍介面卡閉包物件)。表示式views::join(e)與join_view<views::all_t<decltype((e))>>{e}對於任何合適的子表示式e都是表示式等價的。
join_view
模擬 input_range
。
當滿足以下條件時,join_view
模擬 forward_range
:
- ranges::range_reference_t<V> 是引用型別,且
- V 和 ranges::range_reference_t<V> 各自模擬
forward_range
。
當滿足以下條件時,join_view
模擬 bidirectional_range
:
- ranges::range_reference_t<V> 是引用型別,
- V 模擬
bidirectional_range
,且 - ranges::range_reference_t<V> 模擬
bidirectional_range
和common_range
。
當滿足以下條件時,join_view
模擬 common_range
:
- ranges::range_reference_t<V> 是引用型別,且
- V 和 ranges::range_reference_t<V> 各自模擬
forward_range
和common_range
。
目錄 |
[編輯] 成員函式
構造 join_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> 的公共成員函式) |
[編輯] 推導指南
[編輯] 巢狀類
迭代器型別 (僅用於說明的成員類模板*) | |
哨兵型別 (僅用於說明的成員類模板*) |
[編輯] 注意
在採用 P2328R1 之前,內部範圍型別 (ranges::range_reference_t<V>) 不能是容器型別(但可以是容器的引用)。例如,不允許連線 transform_view
的 std::string prvalue。
struct Person { int age; std::string name; }; auto f(std::vector<Person>& v) { // return v | std::views::transform([](auto& p){ return p.name; }) // | std::views::join; // error before P2328R1 return v | std::views::transform([](auto& p) -> std::string& { return p.name; }) | std::views::join; // OK }
[編輯] 示例
執行此程式碼
#include <iostream> #include <ranges> #include <string_view> #include <vector> int main() { using namespace std::literals; const auto bits = {"https:"sv, "//"sv, "cppreference"sv, "."sv, "com"sv}; for (char const c : bits | std::views::join) std::cout << c; std::cout << '\n'; const std::vector<std::vector<int>> v{{1, 2}, {3, 4, 5}, {6}, {7, 8, 9}}; auto jv = std::ranges::join_view(v); for (int const e : jv) std::cout << e << ' '; std::cout << '\n'; }
輸出
https://cppreference.tw 1 2 3 4 5 6 7 8 9
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3474 | C++20 | views::join(e) 返回 e 的副本,當 e 是 join_view 時 |
返回巢狀的 join_view |
P2328R1 | C++20 | 非檢視 range prvalue 不能由 join_view 連線 |
變為可連線 |
[編輯] 參閱
一個 view ,由扁平化範圍檢視獲得的序列組成,元素之間帶有分隔符(類模板) (範圍介面卡物件) | |
一個 view ,由連線的介面卡檢視組成(類模板) (自定義點物件) |