名稱空間
變體
操作

std::ranges::views::join, std::ranges::join_view

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
 
定義於標頭檔案 <ranges>
template< ranges::input_range V >

    requires ranges::view<V> and
             ranges::input_range<ranges::range_reference_t<V>>
class join_view

    : public ranges::view_interface<join_view<V>>
(1) (C++20 起)
namespace views {

    inline constexpr /* unspecified */ join = /* unspecified */;

}
(2) (C++20 起)
呼叫簽名 (Call signature)
template< ranges::viewable_range R >

    requires /* 見下文 */

constexpr ranges::view auto join( R&& r );
(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

當滿足以下條件時,join_view 模擬 bidirectional_range

當滿足以下條件時,join_view 模擬 common_range

目錄

[編輯] 成員函式

構造 join_view
(公共成員函式) [編輯]
返回底層(適配)檢視的副本
(公共成員函式) [編輯]
返回指向起始的迭代器
(公共成員函式) [編輯]
返回一個迭代器或一個哨兵到末尾
(公共成員函式) [編輯]
繼承自 std::ranges::view_interface
返回派生檢視是否為空,僅當其滿足 sized_rangeforward_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_rangecommon_range 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]

[編輯] 推導指南

[編輯] 巢狀類

迭代器型別
(僅用於說明的成員類模板*)
哨兵型別
(僅用於說明的成員類模板*)

[編輯] 注意

在採用 P2328R1 之前,內部範圍型別 (ranges::range_reference_t<V>) 不能是容器型別(但可以是容器的引用)。例如,不允許連線 transform_viewstd::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 的副本,當 ejoin_view 返回巢狀的 join_view
P2328R1 C++20 非檢視 range prvalue 不能由 join_view 連線 變為可連線

[編輯] 參閱

一個 view,由扁平化範圍檢視獲得的序列組成,元素之間帶有分隔符
(類模板) (範圍介面卡物件)[編輯]
一個 view,由連線的介面卡檢視組成
(類模板) (自定義點物件)[編輯]