0

0

C++中std::ranges::views::enumerate怎么用_C++23带索引遍历容器【现代】

穿越時空

穿越時空

发布时间:2026-02-04 15:06:30

|

284人浏览过

|

来源于php中文网

原创

std::ranges::views::enumerate要求底层范围是forward_range且common_range,故不支持std::list(end()与begin()类型可能不同)、输入范围(非forward_range)等;安全用于vector、array等。

c++中std::ranges::views::enumerate怎么用_c++23带索引遍历容器【现代】

std::ranges::views::enumerate 是 C++23 引入的视图适配器,用于给任意范围(range)添加索引,生成 (size_t, value) 对。它不复制数据、不修改原容器,只在迭代时按需计算索引 —— 但要注意:它**不能用于所有容器,且索引类型固定为 size_t,不可自定义起始值。**

为什么 enumerate 不能直接套用在 std::list 或输入范围上?

因为 std::ranges::views::enumerate 要求底层范围必须是 forward_range 且具有 common_range 特性(即 begin()/end() 类型相同)。std::list 满足 forward_range,但它的 end()std::list::iterator,而某些实现中 begin()end() 可能不是同一类型(尤其在 debug 模式或旧标准库下),导致编译失败;更典型的是输入范围(如 std::istream_view)连 forward_range 都不是,直接报错 no matching function for call to 'enumerate'

  • ✅ 安全使用:std::vectorstd::array、C 风格数组、std::string_view
  • ⚠️ 可能失败:std::liststd::forward_list(取决于标准库实现和编译模式)
  • ❌ 明确不支持:输入流视图、生成器返回的单遍范围(single-pass range)

怎么正确写出带索引的 for 循环?

enumerate 返回的是一个由 std::pair(或 T&&)组成的视图,解构时推荐用结构化绑定,但注意引用语义:

std::vector v = {"a", "bb", "ccc"};
for (auto [i, s] : std::views::enumerate(v)) {
    std::cout << i << ": " << s << "\n"; // i 是 size_t,s 是 std::string&
}
  • 如果想避免拷贝 s,保持 auto [i, s] 即可(s 是引用)
  • 若需修改原容器元素,写成 auto [i, s] 就够了;但若原范围是 const,则 sconst std::string&
  • 不能写 auto& [i, s] —— 因为 i 是纯右值(临时 size_t),绑定到 auto& 会编译失败
  • 也不建议 const auto& [i, s],因为 i 本身是值类型,加 const 无意义,还可能干扰模板推导

enumerate 和传统 for(int i=0; i

几乎没有运行时开销:enumerate 不分配内存,不预计算,每次迭代只做一次整数自增(i++)和一次底层迭代器自增(++it),和手写索引循环的汇编指令数量基本一致。但有两点隐含差异:

HyperWrite
HyperWrite

AI写作助手帮助你创作内容更自信

下载

立即学习C++免费学习笔记(深入)”;

  • 索引类型强制为 size_t:对超大容器(接近 SIZE_MAX)安全,但若你习惯用 int 做索引(比如要传给某个只接受 int 的 API),得显式转换:static_cast(i)
  • 无法跳过元素或反向遍历:enumerate 本质是前向视图,不提供 operator--;想倒序带索引,得先用 std::views::reverse,再 enumerate,但此时索引是逆序的(0 对应最后一个元素),不是原始位置
  • 调试时变量名不直观:在 IDE 中 hover i 只显示 size_t,不像 for (size_t i = 0; ...) 那样明确体现“这是索引”

最易被忽略的一点:enumerate 的索引从 0 开始且不可配置 —— 如果你需要从 1 开始编号(比如打印行号),别试图“在循环里 i+1”,而是用 std::views::iota(1) 和原范围 zip:std::views::zip(std::views::iota(1), v)。enumerate 就是纯粹的“位置计数器”,不多也不少。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

564

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

534

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

564

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

547

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

153

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

204

2025.08.29

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

486

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

164

2023.10.07

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

19

2026.02.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号