C++ range-based for循环 _ 自动遍历容器元素写法【实战】

酷芳姑娘_9220

酷芳姑娘_9220

2026-04-11

149人浏览

原创

range-based for循环默认按值拷贝,修改无效;需用auto&或const auto&避免深拷贝并支持修改或只读访问;结构化绑定for(auto& [k,v] : m)语义更清晰;仅要求容器提供begin()/end(),但修改容器时迭代器可能失效。

c++ range-based for循环 _ 自动遍历容器元素写法【实战】

range-based for 循环不是语法糖的简单替代,它默认按值拷贝,不加 & 或 && 就可能意外触发深拷贝或无法修改原容器元素。

为什么遍历 vector 时修改元素没生效?

常见现象:写 for (auto s : strs) { s += "x"; },结果 strs 完全没变——因为 s 是每个 string 的副本,改的是临时对象。

  • 要修改原容器内容,必须用引用:for (auto& s : strs)
  • 如果只读且容器元素较大(如 std::vector<:vector>></:vector>),避免拷贝开销,也该用 const auto& s : strs
  • 注意 auto&& 在某些模板上下文中可转发,但普通遍历中没必要,反而增加理解成本

遍历 map 时怎么同时拿到 key 和 value?

不能直接写 for (auto kv : m) 然后用 kv.first/kv.second ——这没错,但容易忽略类型推导细节。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • std::map<k>::value_type</k> 是 std::pair<const k v></const>,所以 kv.first 是 const K&,不能赋值;kv.second 类型是 V&(当用 auto& 时),可修改
  • 更清晰写法:for (auto& [k, v] : m)(C++17 结构化绑定),k 自动为 const K&,v 为 V&,语义明确
  • 若用 auto [k, v] : m(无引用),则 v 是副本,修改无效

哪些容器不能用 range-based for?

只要支持 begin()/end() 且返回迭代器类型,基本都能用。但要注意“假容器”陷阱:

  • std::array、std::vector、std::list、std::map 等标准容器都 OK
  • C 风格数组(如 int a[5])也能用,begin(a) 和 end(a) 由标准库重载提供
  • 自定义类型需显式提供 begin()/end() 成员函数或非成员函数,否则编译失败,错误信息通常是 no matching function for call to 'begin'
  • std::initializer_list 可以,但它是只读的,即使写 auto&,元素也是 const 限定的

性能差异:auto vs auto& vs const auto&

对小类型(int、char、指针)影响微乎其微;对大对象(std::string、自定义类)差别显著。

  • auto x : c:每次循环调用元素的拷贝构造函数,c.size() 次开销
  • auto& x : c:零拷贝,但允许通过 x 修改原容器(若容器本身非 const)
  • const auto& x : c:零拷贝 + 编译期防止误改,推荐作为只读遍历的默认写法
  • 注意:若容器是 const std::vector<t></t>,则 auto& 会推导为 const T&,无需额外加 const

最容易被忽略的是:range-based for 的底层仍依赖迭代器,一旦在循环体内修改了容器(如 push_back、erase),迭代器很可能失效,行为未定义——这不是语法问题,而是容器语义约束,得靠逻辑规避。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

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

2023.08.02

6119

3

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

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

2023.09.20

2138

7

string转int
string转int

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

2023.08.02

6119

3

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

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

2024.08.29

2985

6

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

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

2025.08.29

3828

10

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

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

2025.08.29

2665

10

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

339

31

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

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

2025.09.05

550

5

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

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

2025.11.16

323

7

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习