0

0

c++中如何使用范围for循环_c++ range-based for遍历容器【实例】

冰火之心

冰火之心

发布时间:2026-01-17 13:01:32

|

545人浏览过

|

来源于php中文网

原创

range-based for循环要求容器支持begin()/end()且返回前向迭代器,适用于vector、list、map、array及原生数组;最简形式为for(const auto& item : container);遍历map时item为pair,C++17起推荐用结构化绑定for(const auto& [key, value] : my_map)。

c++中如何使用范围for循环_c++ range-based for遍历容器【实例】

range-based for 循环的基本写法与适用容器

只要容器支持 begin()end() 成员函数(或非成员重载),且返回的迭代器满足前向迭代器要求,就能用范围 for。标准容器如 std::vectorstd::liststd::mapstd::array 和原生数组都符合。

最简形式是:

for (const auto& item : container) { /* 使用 item */ }
注意这里用 const auto& 是为了不拷贝、不修改——这是最常用也最安全的起点。

  • 想修改元素?用 auto&(非常量左值引用)
  • 需要拷贝一份再处理?用 auto(值语义)
  • 遍历 std::map 时,itemstd::pair 类型,不是单个值

遍历 map 时取 key 和 value 的正确方式

直接写 for (auto& p : my_map) 后,p.first 是 key,p.second 是 value。别试图用结构化绑定以外的方式“拆开”——C++17 起推荐用结构化绑定更清晰:

for (const auto& [key, value] : my_map) {
    std::cout << key << " -> " << value << "\n";
}

注意:[key, value] 是声明,不是访问语法;类型自动推导;如果要修改 value,得把 const auto& 换成 auto&,但 key 仍不可改(因为是 const Key)。

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

PaperAiBye
PaperAiBye

支持近30多种语言降ai降重,并且支持多种语言免费测句子的ai率,支持英文aigc报告等

下载
  • auto(无引用)会触发 std::pair 拷贝,对大对象不划算
  • std::unordered_map 同样适用该写法,顺序不保证而已
  • 若编译器不支持 C++17,退回用 p.first/p.second

常见错误:试图在循环中修改容器大小

范围 for 底层依赖 begin()/end() 迭代器。一旦在循环体中调用 push_back()erase() 等改变容器 size 或 layout 的操作,原有迭代器很可能失效,导致未定义行为——不是崩溃就是跳过元素。

  • std::vectorpush_back() 触发 reallocation 时,所有迭代器立即失效
  • std::map 插入一般不使其他迭代器失效,但 erase(it) 会使 it 失效,而范围 for 的内部迭代器正是这个 it
  • 真要边遍历边删?用传统 for + erase() 返回值,或先收集待删 key 再批量处理

自定义类型如何支持 range-based for

只需提供 begin()end() 成员函数(或自由函数),返回可解引用、可递增、可比较相等的迭代器类型即可。例如:

class MyRange {
    int data[3] = {1, 2, 3};
public:
    int* begin() { return data; }
    int* end() { return data + 3; }
};

然后就能写 for (int x : MyRange{}) { ... }。注意:返回裸指针也合法,只要满足迭代器概念;但生产代码建议封装为类迭代器,支持 const 版本和反向遍历。

容易被忽略的是 const 容器的支持——必须额外提供 const_begin()/const_end() 或重载 const 成员函数,否则 const MyRange r; 无法参与范围 for。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

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

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

524

2023.09.20

string转int
string转int

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

317

2023.08.02

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

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

538

2024.08.29

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

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

52

2025.08.29

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

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

197

2025.08.29

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

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

33

2025.11.16

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号