Namespaces
Variants

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

From cppreference.net
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 /* 未指定 */ 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++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 th 个元素的视图。
2) 每个 views::elements 的特化都是一个 范围适配器对象 。表达式 views :: elements < M > ( e ) elements_view < views:: all_t < decltype ( ( e ) ) > , M > { e } 对任何合适的子表达式 e 和常量表达式 M 均构成 表达式等价
3) 确保底层视图的元素是类元组值 ,参见 tuple-like (since C++23)
4) 确保不会返回悬空引用。

elements_view 在底层视图 V 满足相应概念时,实现以下概念模型: random_access_range bidirectional_range forward_range input_range common_range 以及 sized_range

目录

数据成员

成员 描述
V base_ 底层视图
( 仅用于说明的成员对象* )

成员函数

构造一个 elements_view
(公开成员函数)
返回底层(适配的)视图的副本
(公开成员函数)
返回指向起始位置的迭代器
(公开成员函数)
返回指向末尾位置的迭代器或哨兵
(公开成员函数)
返回元素数量,仅当底层(适配的)范围满足 sized_range 时提供
(公开成员函数)
返回生成的 approximately_sized_range 的近似大小
(公开成员函数)
继承自 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> 的公开成员函数)
返回派生视图中的第 n 个元素,仅当它满足 random_access_range 时提供
( std::ranges::view_interface<D> 的公开成员函数)

嵌套类

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

辅助模板

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 的特化使得当底层视图满足 borrowed_range 时, elements_view 也满足该概念。

示例

#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
它才是 borrowed_range
LWG 3502 C++20 可能从 elements_view 获取悬垂引用 禁止此类用法

参见

接受由类对值组成的 view ,生成每个对中第一个元素的 view
(类模板) (范围适配器对象)
接受由类对值组成的 view ,生成每个对中第二个元素的 view
(类模板) (范围适配器对象)
由被适配视图的对应元素引用元组组成的 view
(类模板) (定制点对象)
由被适配视图的对应元素应用变换函数的结果组成的 view
(类模板) (定制点对象)
类BLAS的valarray切片:起始索引、长度、步长
(类)