命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | ranges
 
 
范围库
范围适配器
 
 
定义于头文件 <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 起)
调用签名
template< ranges::viewable_range R >

    requires /* see below */

constexpr ranges::view auto join( R&& r );
(自 C++20 起)
1) 范围适配器,表示由展平范围的视图所获得的序列组成的 视图
2) RangeAdaptorObject (以及 RangeAdaptorClosureObject)。表达式 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 右值。

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.cn
1 2 3 4 5 6 7 8 9

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
LWG 3474 C++20 views::join(e)ejoin_view 时返回 e 的副本 返回嵌套的 join_view
P2328R1 C++20 非视图 range 右值不能通过 join_view 连接 变为可连接

[编辑] 参见

一个 视图,由展平范围视图获得的序列组成,元素之间带有分隔符
(类模板) (范围适配器对象)[编辑]
一个 视图,由适配视图的连接组成
(类模板) (自定义点对象)[编辑]