std::ranges:: views:: join, std::ranges:: join_view
|
定义于头文件
<ranges>
|
||
|
template
<
ranges::
input_range
V
>
requires
ranges::
view
<
V
>
and
|
(1) | (C++20 起) |
|
namespace
views
{
inline
constexpr
/* 未指定 */
join
=
/* 未指定 */
;
|
(2) | (C++20 起) |
|
调用签名
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* 见下文 */
|
(C++20 起) | |
view
。
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 |
|
返回派生视图是否为空,仅在满足
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://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
(类模板) (定制点对象) |