如何将for_each的循环语法糖改写为长尾简化集合迭代?
- 内容介绍
- 相关推荐
本文共计960个文字,预计阅读时间需要4分钟。
c++for_each 是 C++ 标准库提供的算法,本质上是函数模板,不是语法糖——它不改变语言结构,也不支持 break 或 continue,也不能修改循环变量本身(如 i++)。很多人误以为它是增强 for 循环,但实际上 C++11 引入的 for 循环(for (auto))才是增强版的 for 循环。
常见错误现象:for_each(v.begin(), v.end(), [](int x) { if (x == 5) break; }) —— 编译失败,lambda 内的 break 无效,因为没在循环语境中。
- 适用场景:纯遍历 + 副作用(如打印、插入日志、修改元素值)
- 不适用场景:需要提前退出、依赖索引、或需访问迭代器位置(如相邻元素比较)
- 性能影响:和手写循环几乎无差别,但额外一层函数调用开销可忽略(编译器通常内联)
什么时候该用范围 for 而不是 for_each
范围 for 更简洁、直观,且天然支持引用、const、移动语义等。
本文共计960个文字,预计阅读时间需要4分钟。
c++for_each 是 C++ 标准库提供的算法,本质上是函数模板,不是语法糖——它不改变语言结构,也不支持 break 或 continue,也不能修改循环变量本身(如 i++)。很多人误以为它是增强 for 循环,但实际上 C++11 引入的 for 循环(for (auto))才是增强版的 for 循环。
常见错误现象:for_each(v.begin(), v.end(), [](int x) { if (x == 5) break; }) —— 编译失败,lambda 内的 break 无效,因为没在循环语境中。
- 适用场景:纯遍历 + 副作用(如打印、插入日志、修改元素值)
- 不适用场景:需要提前退出、依赖索引、或需访问迭代器位置(如相邻元素比较)
- 性能影响:和手写循环几乎无差别,但额外一层函数调用开销可忽略(编译器通常内联)
什么时候该用范围 for 而不是 for_each
范围 for 更简洁、直观,且天然支持引用、const、移动语义等。

