命名空间
变体
操作

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

来自 cppreference.cn
< cpp‎ | ranges
 
 
范围库 (Ranges library)
范围适配器 (Range adaptors)
 
 
定义于头文件 <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 >
    constexpr /* unspecified */ elements = /* unspecified */;

}
(2) (C++20 起)
调用签名 (Call signature)
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++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) (仅作说明*)
1) 接受一个元组类值的 view,并生成一个视图,其值类型为适配视图的值类型的第 N 个元素。
2) views::elements 的每个特化都是一个 RangeAdaptorObject。对于任何合适的子表达式 e 和常量表达式 M,表达式 views::elements<M>(e)表达式等价elements_view<views::all_t<decltype((e))>, M>{e}
3) 确保底层视图的元素是元组类值,见 tuple-like(C++23 起)
4) 确保不会返回悬空引用。

当底层视图 V 满足相应的概念时,elements_view 满足概念 random_access_rangebidirectional_rangeforward_rangeinput_rangecommon_rangesized_range

目录

[编辑] 数据成员

成员名称 (Member name) 定义
base_ (私有) 类型为 V 的底层(已适配)视图
(仅用于阐释的成员对象*)

[编辑] 成员函数

构造一个 elements_view
(public 成员函数) [编辑]
返回底层(适配)视图的副本
(public 成员函数) [编辑]
返回指向起始的迭代器
(public 成员函数) [编辑]
返回一个迭代器或一个哨兵到末尾
(public 成员函数) [编辑]
返回元素数量,仅当底层(适配的)范围满足 sized_range 时提供
(public 成员函数) [编辑]
继承自 std::ranges::view_interface
如果派生视图满足 sized_rangeforward_range,则返回派生视图是否为空
(std::ranges::view_interface<D> 的 public 成员函数) [编辑]
(C++23)
返回范围开头的常量迭代器
(std::ranges::view_interface<D> 的 public 成员函数) [编辑]
(C++23)
返回范围常量迭代器的哨兵
(std::ranges::view_interface<D> 的 public 成员函数) [编辑]
返回派生视图是否非空,仅当 ranges::empty 适用于它时提供
(std::ranges::view_interface<D> 的 public 成员函数) [编辑]
返回派生视图中的第一个元素,如果它满足 forward_range 则提供
(std::ranges::view_interface<D> 的 public 成员函数) [编辑]
如果派生视图满足 bidirectional_rangecommon_range,则返回派生视图中的最后一个元素
(std::ranges::view_interface<D> 的 public 成员函数) [编辑]
返回派生视图中的第 n 个元素,仅当它满足 random_access_range 时提供
(std::ranges::view_interface<D> 的 public 成员函数) [编辑]

[编辑] 嵌套类

迭代器类型
(仅用于说明的成员类模板*)
哨兵类型
(仅用于说明的成员类模板*)

[编辑] 辅助模板

template<class T, std::size_t N>

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

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

ranges::enable_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 可能会获得悬空引用 禁止此类用法

[编辑] 参阅

接受一个由类似对的值组成的view,并生成一个由每对的第一个元素组成的view
(类模板) (range 适配器对象)[编辑]
接受一个由类似对的值组成的view,并生成一个由每对的第二个元素组成的view
(类模板) (range 适配器对象)[编辑]
一个由引用到适配视图对应元素的元组组成的 view
(类模板) (定制点对象)[编辑]
一个由转换函数应用于适配视图中对应元素的结果组成的 view
(类模板) (定制点对象)[编辑]
valarray 的类 BLAS 切片:起始索引、长度、步长
(类) [编辑]