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

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
 
在标头 <ranges> 定义
template<ranges::input_range V >

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

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

    inlineconstexpr/* 未指定 */ join =/* 未指定 */;

}
(2) (C++20 起)
调用签名
template<ranges::viewable_range R >

    requires /* 见下文 */

constexprranges::viewauto join( R&& r );
(C++20 起)
1) 表示由从拉平范围的视图获得的序列组成的 view
2)范围适配器对象(RangeAdaptorObject) (也是 范围适配器闭包对象(RangeAdaptorClosureObject) )。对于任何适合的子表达式 e 表达式 views::join(e)表达式等价join_view<views::all_t<decltype((e))>>{e}

join_view 实现 input_range

以下情况下 join_view 实现 forward_range

以下情况下 join_view 实现 bidirectional_range

以下情况下 join_view 实现 common_range

目录

[编辑]成员函数

构造 join_view
(公开成员函数)[编辑]
返回底层(适配的)视图的副本
(公开成员函数)[编辑]
返回指向起始的迭代器
(公开成员函数)[编辑]
返回 指向末尾的迭代器或哨位
(公开成员函数)[编辑]
继承自 std::ranges::view_interface
返回视图是否为空,仅当视图满足 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_rangecommon_range 时提供
(std::ranges::view_interface<D> 的公开成员函数)[编辑]

[编辑]推导指引

[编辑]嵌套类

迭代器类型
(仅用于阐述的成员类模板*)
哨位类型
(仅用于阐述的成员类模板*)

[编辑]注解

在接纳 P2328R1 前,内层范围类型(ranges::range_reference_t<V>)不能是容器类型(但可以是容器的引用)。例如不允许接合 std::string 纯右值的 transform_view

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; // 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(){usingnamespace std::literals;   constauto bits ={"https:"sv, "//"sv, "cppreference"sv, "."sv, "com"sv};for(charconst c : bits | std::views::join)std::cout<< c;std::cout<<'\n';   conststd::vector<std::vector<int>> v{{1, 2}, {3, 4, 5}, {6}, {7, 8, 9}};auto jv = std::ranges::join_view(v);for(intconst e : jv)std::cout<< e <<' ';std::cout<<'\n';}

输出:

https://cppreference.com 1 2 3 4 5 6 7 8 9

[编辑]缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3474 C++20 views::join(e)ejoin_view 时会返回 e 的副本 返回嵌套的 join_view
P2328R1 C++20 join_view 无法接合非视图 range 纯右值 使得可接合

[编辑]参阅

由拉平范围组成的视图并以分隔符间隔所获得的序列构成的 view
(类模板)(范围适配器对象)[编辑]
连接所适配各视图而组成的 view
(类模板)(定制点对象)[编辑]
close