讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ for_each怎么用 C++ STL算法库遍历容器操作【便利】

老雪君_5591

老雪君_5591

发布时间:2026-01-25 09:51:41

|

478人浏览过

|

来源于php中文网

原创

std::for_each是中的函数模板,用于对区间内每个元素调用指定可调用对象,不支持break/continue,仅依次调用且返回函数对象副本。

c++ for_each怎么用 c++ stl算法库遍历容器操作【便利】

for_each 是函数模板,不是循环语句

std::for_each 是 <algorithm></algorithm> 头文件里的函数模板,作用是对区间内每个元素调用指定的函数对象(可调用物)。它不提供“遍历控制权”,也不支持提前跳出(除非抛异常),和 for 循环语义不同。

常见误用是把它当 for 写法的替代品来“控制流程”,结果发现不能 break、不能 continue、返回值无意义。它只做一件事:依次调用。

  • 必须传入左闭右开区间:begin 和 end 迭代器(比如 v.begin(), v.end())
  • 第三个参数是可调用对象:可以是 lambda、函数指针、functor,但签名必须接受单个参数(元素类型或其引用)
  • 对空容器安全,不会执行任何调用

lambda 捕获与引用陷阱

用 lambda 时最容易踩的是变量捕获方式错误。尤其修改外部变量或遍历容器本身时,[&] 和 [=] 行为差异极大。

例如想统计偶数个数:

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

int count = 0;
std::for_each(v.begin(), v.end(), [&count](int x) { if (x % 2 == 0) ++count; });

这里必须用 [&count] 或 [&],用 [=] 会捕获 count 的副本,外部 count 不变。

C++14
C++14

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

下载
  • 若 lambda 修改容器元素,应捕获元素引用:[](int& x) { x *= 2; }
  • 若只读,用 const int& 更高效(避免拷贝大对象)
  • 在 range-based for 更清晰的场景(如简单修改、打印),别硬套 for_each

for_each 和 range-based for 的性能与可读性取舍

两者生成的汇编通常一致,编译器能很好优化。区别主要在表达意图和维护成本。

  • for_each 更适合“把操作抽象成独立行为”的场景,比如复用同一个处理逻辑:for_each(a.begin(), a.end(), log_item) + for_each(b.begin(), b.end(), log_item)
  • range-based for 在需要索引、条件跳过、或混合操作(如“遇到 0 就停止”)时更直接;for_each 做不到自然中断
  • 调试时,lambda 调用栈比 for 循环深一层,断点不易打到具体某次迭代

for_each 返回值常被忽略的用途

std::for_each 返回传入的函数对象(按值返回),不是 void。这个特性极少用,但可用于链式调用或检查状态(比如 functor 内部计数)。

例如:

struct Counter {
    int n = 0;
    void operator()(int) { ++n; }
};
Counter c = std::for_each(v.begin(), v.end(), Counter{});
// 此时 c.n 是容器大小(前提是没提前退出)

注意:返回的是副本,原对象状态未保留;若 functor 有状态且需后续访问,应传入左值引用或改用其他方式。

真正需要这种写法的场景极少见,多数时候只是白添复杂度。别为了“用 STL”而用 for_each —— 容器是否支持随机访问、操作是否纯、是否要异常安全,这些才决定该不该选它。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3588

2023.11.20

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

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

2338

2023.09.20

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

3060

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

827

2025.10.24

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

827

2025.10.24

string转int
string转int

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

7019

2023.08.02

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

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

3365

2024.08.29

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

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

4388

2025.08.29

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn