Namespaces
Variants

std::ranges:: views:: enumerate, std::ranges:: enumerate_view

From cppreference.net
Ranges library
Range adaptors
定义于头文件 <ranges>
template < ranges:: view V >

requires /*range-with-movable-references*/ < V >
class enumerate_view

: public ranges:: view_interface < enumerate_view < V >>
(1) (C++23 起)
namespace views {

inline constexpr /* 未指定 */ enumerate = /* 未指定 */ ;

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

requires /* 见下文 */

constexpr /* 见下文 */ enumerate ( R && r ) ;
(C++23 起)
辅助概念
template < class R >

concept /*range-with-movable-references*/ =
ranges:: input_range < R > &&
std:: move_constructible < ranges:: range_reference_t < R >> &&

std:: move_constructible < ranges:: range_rvalue_reference_t < R >> ;
(3) ( 仅用于阐释* )
1) enumerate_view 是一个范围适配器,它接收一个 view 并生成一个由 tuple 组成的视图。结果序列的第 i th 个元素(即元组)包含:
  • 等于 i 的值(表示底层序列元素的从零开始计数的索引),以及
  • 对底层元素的引用。
2) 名称 views::enumerate 表示一个 范围适配器对象 。给定子表达式 e ,表达式 views :: enumerate ( e ) enumerate_view < views:: all_t < decltype ( ( e ) ) >> ( e ) 对任何合适的子表达式 e 表达式等价 的。
3) 确保底层类型的引用类型可以被移动。

enumerate_view 满足 random_access_range bidirectional_range forward_range input_range common_range sized_range 概念,当底层视图 V 满足相应概念时。

目录

数据成员

成员 描述
V base_ 指向底层 view 的迭代器
( 仅用于说明的成员对象* )

成员函数

构造 enumerate_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> 的公开成员函数)

推导指引

嵌套类

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

辅助模板

template < class View >

constexpr bool enable_borrowed_range < ranges :: enumerate_view < View >> =

ranges:: enable_borrowed_range < View > ;
(C++23 起)

ranges::enable_borrowed_range 的这一特化使得 enumerate_view 在底层视图满足 borrowed_range 时同样满足该概念。

注释

功能测试 标准 功能
__cpp_lib_ranges_enumerate 202302L (C++23) std::ranges::enumerate_view

示例

#include <initializer_list>
#include <iostream>
#include <map>
#include <ranges>
#include <vector>
int main()
{
    constexpr static auto v = {'A', 'B', 'C', 'D'};
    for (auto const [index, letter] : std::views::enumerate(v))
        std::cout << '(' << index << ':' << letter << ") ";
    std::cout << '\n';
#if __cpp_lib_ranges_to_container
    // 使用每个元素的位置作为键创建映射
    auto m = v | std::views::enumerate | std::ranges::to<std::map>();
    for (auto const [key, value] : m)
        std::cout << '[' << key << "]:" << value << ' ';
    std::cout << '\n';
#endif
    std::vector<int> numbers{1, 3, 5, 7};
    // 即使使用const,num仍然是可变的,因为const不会传播到引用
    // 要使其为const,请使用 `std::views::enumerate(numbers) | std::views::as_const`
    // 或 `std::views::enumerate(std::as_const(numbers))`
    for (auto const [index, num] : std::views::enumerate(numbers))
    {
        ++num; // 类型为int&
        std::cout << numbers[index] << ' ';
    }
    std::cout << '\n';
}

可能的输出:

(0:A) (1:B) (2:C) (3:D)
[0]:A [1]:B [2]:C [3]:D
2 4 6 8

参考文献

  • C++23 标准 (ISO/IEC 14882:2024):
  • 26.7.23 枚举视图 [range.enumerate]

参见

通过重复递增初始值生成的序列组成的 view
(类模板) (定制点对象)
由对应适配视图元素的引用元组组成的 view
(类模板) (定制点对象)
接受由 tuple-like 值组成的 view 和数字N,生成每个元组第N个元素的 view
(类模板) (范围适配器对象)