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 { inlineconstexpr/* 未指定 */ join =/* 未指定 */; | (2) | (C++20 起) |
调用签名 | ||
template<ranges::viewable_range R > requires /* 见下文 */ | (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
:
- 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 | |
返回视图是否为空,仅当视图满足 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>)不能是容器类型(但可以是容器的引用)。例如不允许接合 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) 在 e 是 join_view 时会返回 e 的副本 | 返回嵌套的 join_view |
P2328R1 | C++20 | join_view 无法接合非视图 range 纯右值 | 使得可接合 |
[编辑]参阅
由拉平范围组成的视图并以分隔符间隔所获得的序列构成的 view (类模板)(范围适配器对象) | |
连接所适配各视图而组成的 view (类模板)(定制点对象) |