◐ Shell
clean mode source ↗

std::ranges::views::join, std::ranges::join_view - cppreference.com

来自cppreference.com

在标头 <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 /* 未指定 */ join = /* 未指定 */;
}
(2) (C++20 起)

调用签名

template< ranges::viewable_range R >
    requires /* 见下文 */
constexpr ranges::view auto join( R&& r );
(C++20 起)

1) 表示由从拉平范围的视图获得的序列组成的

view

join_view 实现 input_range

以下情况下 join_view 实现 forward_range

  • ranges::range_reference_t<V> 是引用类型,且
  • Vranges::range_reference_t<V> 都实现 forward_range

以下情况下 join_view 实现 bidirectional_range

以下情况下 join_view 实现 common_range

  • ranges::range_reference_t<V> 是引用类型,且
  • Vranges::range_reference_t<V> 都实现 forward_rangecommon_range

成员函数

构造 join_view
(公开成员函数) [编辑]
返回底层(适配的)视图的副本
(公开成员函数) [编辑]
返回指向起始的迭代器
(公开成员函数) [编辑]
返回 指向末尾的迭代器或哨位
(公开成员函数) [编辑]
继承自 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()
{
    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 纯右值 使得可接合

参阅