Namespaces
Variants

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

来自 zh.cppreference.net
 
 
范围库
范围适配器
 
 
在头文件 <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 /* unspecified */ enumerate = /* unspecified */;
}
(2) (C++23 起)
调用签名
template< ranges::viewable_range R >
    requires /* see below */
constexpr /* see below */ 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 并生成一个 std::tuple 的视图。 结果序列的第 ith 个元素(元组)包含:
  • 等于 i 的值,即底层序列元素的从零开始的索引,以及
  • 对底层元素的引用。
2) 名称 views::enumerate 表示一个 RangeAdaptorObject。 给定子表达式 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 的近似大小
(公开成员函数)
继承自 ranges::view_interface
返回派生视图是否为空,仅在其满足 sized_range(有大小范围) 或 forward_range(前向范围)
时提供。(std::ranges::view_interface<D> 的公开成员函数)
返回指向范围起始位置的常量迭代器。(
的公开成员函数)std::ranges::view_interface<D>
返回范围常量迭代器的哨位。(
的公开成员函数)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
(类模板) (范围适配器对象)