C++ for_each怎么用 C++ STL算法库遍历容器操作【便利】
技术百科
尼克
发布时间:2026-01-25
浏览: 次 std::for_each是中的函数模板,用于对区间内每个元素调用指定可调用对象,不支持break/continue,仅依次调用且返回函数对象副本。
for_each 是函数模板,不是循环语句
std::for_each 是 头文件里的函数模板,作用是对区间内每个元素调用指定的函数对象(可调用物)。它不提供“遍历控制权”,也不支持提前跳出(除非抛异常),和 for 循环语义不同。
常见误用是把它当 for 写法的替代品来“控制流程”,结果发现不能 break、不能 continue、返回值无意义。它只做一件事:依次调用。
- 必须传入左闭右开区间:
begin和end迭代器(比如v.begin(),v.end()) - 第三个参数是可调用对象:可以是 lambda、函数指针、functor,但签名必须接受单个参数(元素类型或其引用)
- 对
空容器安全,不会执行任何调用
lambda 捕获与引用陷阱
用 lambda 时最容易踩的是变量捕获方式错误。尤其修改外部变量或遍历容器本身时,[&] 和 [=] 行为差异极大。
例如想统计偶数个数:
int count = 0;
std::for_each(v.begin(), v.end(), [&count](int x) { if (x % 2 == 0) ++count; });
这里必须用 [&count] 或 [&],用 [=] 会捕获 count 的副本,外部 count 不变。
- 若 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 —— 容器是否支持随机访问、操作是否纯、是否要异常安全,这些才决定该不该选它。
# 的是
# 很好
# 也不
# 把它
# 链式
# 迭代
# go
# 循环
# 对象
# c++
# int
# void
# 函数模板
# 区别
# 指针
# 栈
# 算法
# break
# 返回值
# 遍历
# for
# count
# Lambda
# const
# 极少
# continue
# 区间内
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10如何卸载自带Edge_Win10彻底卸载
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- 如何使用Golang安装依赖库_管理模块和第三方包
- Windows系统被恶意软件破坏后的恢复策略_错误
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- 如何在包含多值的列中精准搜索指定演员?
- 网站内页做seo排名怎么做?
- Win11怎样激活系统密钥_Win11系统密钥激活
- Windows10电脑怎么查看硬盘通电时间_Win
- php嵌入式需要什么环境_搭建php+linux嵌
- Win10怎样清理C盘Steam游戏缓存_Win1
- Win11怎么设置夜间模式_Windows11显示
- 如何在Golang中配置代码格式化工具_使用gof
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- php删除数据怎么软删除_添加is_del字段标记
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- Win10系统怎么查看显卡温度_Win10任务管理
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- Mac系统更新下载慢或失败怎么办_解决macOS升
- Win10如何更改用户账户控制_Windows10
- Win11如何关闭小娜Cortana Win11禁
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Windows音频驱动无声音原因解析_声卡驱动错误
- Windows任务计划服务异常原因_任务调度失败的
- 如何解决Windows时间不准的问题?(自动同步设
- windows如何备份注册表_windows导出和
- 如何高效删除 NumPy 二维数组中所有元素相同的
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- 如何使用Golang进行HTTP服务性能测试_测量
- Win10怎样卸载iTunes_Win10卸载iT
- 如何在 Django 中安全修改用户密码而不使会话
- 如何使用Golang实现容器自动化运维_Golan
- 如何在 Go 中比较自定义的数组类型(如 [20]
- Win10文件历史记录怎么用 Win10开启自动备
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- Windows怎样拦截QQ浏览器广告_Window
- 如何在 Python 测试中动态配置 @backo
- Go 中实现 Python urllib.quot
- 如何更改Windows资源管理器的默认启动位置?(
- 本地php环境打开php文件直接下载_浏览器解析p
- C++中的协变与逆变是什么?C++函数指针与返回类
- MAC怎么使用表情符号面板_MAC Emoji快捷
- Win11怎么开启远程桌面连接_Windows11
- Python模块的__name__属性如何由导入方
- php485函数执行慢怎么优化_php485性能提
- Win11怎么开启上帝模式_创建Windows 1
- Win11怎么查看硬盘型号_Windows 11检
- c++中如何使用auto关键字_c++11类型推导
- php订单日志怎么按金额排序_php按订单金额排序
- windows如何禁用驱动程序强制签名_windo


QQ客服