std::ranges::views::join, std::ranges::join_view
来自 zh.cppreference.net
| 定义于头文件 <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) 一个范围适配器,表示通过展平范围之视图而获得的序列组成的view。
2) RangeAdaptorObject(同时也是 RangeAdaptorClosureObject)。表达式
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
(公开成员函数) |
|
|
返回底层(适配的)视图的副本
(公开成员函数) |
|
|
返回指向起始位置的迭代器
(公开成员函数) |
|
|
返回指向末尾位置的迭代器或哨兵
(公开成员函数) |
|
继承自 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
>
)不能是容器类型(但可以是容器的引用)。例如,不允许对
std::string
纯右值的
transform_view
进行join操作。
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; // 正确 }
示例
运行此代码
#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://zh.cppreference.net 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 |
非视图
range
纯右值无法被
join_view
连接
|
改为可连接 |
参见
由展平范围视图序列并在元素间插入分隔符构成的
view
(类模板) (范围适配器对象) |
|
由被适配视图的串联组成的
view
(类模板) (定制点对象) |