std::ranges::views::elements, std::ranges::elements_view

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



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

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

    requires ranges::view<V> &&
             has-tuple-element<ranges::range_value_t<V>, N> &&
             has-tuple-element<std::remove_reference_t<
                                   ranges::range_reference_t<V>>, N> &&
             returnable-element<ranges::range_reference_t<V>, N>

class elements_view : public ranges::view_interface<elements_view<V, N>>;
(1) (C++20 起)
namespace views {

    template< std::size_t N >
    inline constexpr /* 未指定 */ elements = /* 未指定 */;

}
(2) (C++20 起)
调用签名
template< ranges::viewable_range R >

    requires /* 见下文 */

constexpr ranges::view auto elements<N>( R&& r );
(C++20 起)
辅助概念
(3)
template< class T, std::size_t N >

concept has-tuple-element =  // 仅用于阐述
    requires(T t) {
        typename std::tuple_size<T>::type;
        requires N < std::tuple_size_v<T>;
        typename std::tuple_element_t<N, T>;
        { std::get<N>(t) } -> std::convertible_to<
                                  const std::tuple_element_t<N, T>&>;

    };
(C++20 起)
(C++23 前)
template< class T, std::size_t N >

concept has-tuple-element =  // 仅用于阐述

    tuple-like<T> && N < std::tuple_size_v<T>
(C++23 起)
template< class T, std::size_t N >

concept returnable-element = // 仅用于阐述
     std::is_reference_v<T> || std::move_constructible<

                                       std::tuple_element_t<N, T>>;
(4) (C++20 起)
1) 接收元组式值的 view,并产生值类型为适配视图的值类型的第 N 元素的视图。
2) views::elements 的每个特化都是范围适配器对象。对于任何适合的表达式 e 和常量表达式 M,表达式 views​::​elements<M>(e) 表达式等价elements_view<views​::​all_t<decltype((e))>, M>{e}
3) 确保底层视图的元素是元组式值,见 tuple-like (C++23 起)
4) 确保不能返回悬垂引用。

elements_view 在底层视图 V 实现 random_access_rangebidirectional_rangeforward_rangeinput_rangecommon_rangesized_range 时实现对应的概念。

成员函数

构造 elements_view
(公开成员函数)
(C++20)
返回底层(适配的)视图的副本
(公开成员函数)
(C++20)
返回指向起始的迭代器
(公开成员函数)
(C++20)
返回指向末尾的迭代器或哨位
(公开成员函数)
(C++20)
返回元素数,只要底层(适配的)范围满足 sized_range
(公开成员函数)
继承自 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> 的公开成员函数)
返回派生视图中的第 n 个元素。若视图满足 random_access_range 则提供。
(std::ranges::view_interface<D> 的公开成员函数)

嵌套类

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

辅助模板

template<class T, std::size_t N>

inline constexpr bool enable_borrowed_range<std::ranges::elements_view<T, N>> =

    std::ranges::enable_borrowed_range<T>;
(C++20 起)

std::ranges::borrowed_range 的此特化使得 elements_view 在底层视图满足 borrowed_range 时满足它。

示例

#include <iostream>
#include <ranges>
#include <string>
#include <tuple>
#include <vector>
 
int main()
{
    const std::vector<std::tuple<int, char, std::string>> vt
    {
        {1, 'A', "α"},
        {2, 'B', "β"},
        {3, 'C', "γ"},
        {4, 'D', "δ"},
        {5, 'E', "ε"},
    };
 
    for (int const e : std::views::elements<0>(vt))
        std::cout << e << ' ';
    std::cout << '\n';
 
    for (char const e : vt | std::views::elements<1>)
        std::cout << e << ' ';
    std::cout << '\n';
 
    for (std::string const& e : std::views::elements<2>(vt))
        std::cout << e << ' ';
    std::cout << '\n';
}

输出:

1 2 3 4 5 
A B C D E 
α β γ δ ε

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3494 C++20 elements_view 始终不是 borrowed_range 在底层视图是 borrowed_range 时它是
LWG 3502 C++20 能从 elements_view 获得悬垂引用 禁止这种用法

参阅

选取 pair 式值组成的 view 并产生每个 pair 的第一元素的 view
(类模板) (范围适配器对象)
选取 pair 式值组成的 view 并产生每个 pair 的第二元素的 view
(类模板) (范围适配器对象)
到被适配视图的对应元素的引用元组组成的 view
(类模板) (定制点对象)
对序列的每个元素应用某个变换函数的 view
(类模板) (范围适配器对象)
valarray 的 BLAS 式切片:起始下标、长度、跨度
(类)