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

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围访问
范围转换器
(C++23)
范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
适配器
范围生成器
范围适配器对象
范围适配器闭包对象
辅助项
 
 
在标头 <ranges> 定义
template< ranges::input_range V >

  requires ranges::view<V> && 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 /* 未指定 */ join = /* 未指定 */;

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

成员函数

构造 join_view
(公开成员函数)
(C++20)
返回底层(适配的)视图的副本
(公开成员函数)
(C++20)
返回指向起始的迭代器
(公开成员函数)
(C++20)
返回指向末尾的迭代器或哨位
(公开成员函数)
继承自 std::ranges::view_interface
(C++20)
返回视图是否为空。若视图满足 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> 的公开成员函数)
(C++20)
返回派生视图中的首元素。若视图满足 forward_range 则提供。
(std::ranges::view_interface<D> 的公开成员函数)
(C++20)
返回派生视图中的末元素。若视图满足 bidirectional_rangecommon_range 则提供。
(std::ranges::view_interface<D> 的公开成员函数)

推导指引

嵌套类

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

注解

在接纳 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()
{
    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.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
(类模板) (范围适配器对象)
用某个分隔符切割另一 view 所获得的子范围的 view
(类模板) (范围适配器对象)