c++中如何使用std::for_each遍历容器_c++迭代器算法用法【实例】
发布时间 - 2026-01-25 00:00:00 点击率:次std::for_each是中的泛型算法,本质为函数调用而非循环语法糖,接收迭代器区间和可调用对象,对每个元素执行一次,无break/continue、不返回中间状态,强调副作用明确的扁平逻辑。
std::for_each 本质是函数调用,不是循环语法糖
std::for_each 是 中的泛型算法,它接收一对迭代器和一个可调用对象,对区间内每个元素执行该可调用对象。它不提供“跳出”或“跳过”的能力(不像 break 或 continue),也不返回中间状态 —— 执行完就结束,返回传入的函数对象(常被忽略)。
常见误解是把它当 for 循环的替代写法,但实际它强调「对每个元素做一件事」的语义,适合副作用明确、逻辑扁平的场景(如打印、更新、收集日志)。若需条件中断、索引访问或提前退出,应优先考虑传统 for 或 while 循环。
正确传参:迭代器范围必须合法,函数对象要能接受解引用类型
传给 std::for_each 的两个迭代器必须构成有效左闭右开区间(first 可达 last,且 last 不可解引用)。函数对象参数的形参类型必须与容器元素类型兼容(自动推导,但常因 const/volatile/引用修饰出错)。
- 对
std::vector,lambda 形参用int、const int&、int&都合法;用int&&会编译失败 - 对
std::map,元素类型是std::pair,不能直接用auto& key拆包 —— 必须解构pair或用结构化绑定(C++17+) - 若容器为空,
first == last,std::for_each不执行任何调用,安全
常见错误:捕获变量生命周期、修改容器导致迭代器失效
在 lambda 中通过引用捕获局部变量时,必须确保 lambda 的生命周期不超过该变量;更危险的是在遍历过程中修改容器大小(如 push_back、erase),这会使所有现存迭代器失效,std::for_each 行为未定义。
以下示例看似自然,实则危险:
std::vectorv = {1, 2, 3}; std::for_each(v.begin(), v.end(), [&v](int x) { if (x == 2) v.push_back(4); // ❌ 迭代器失效! });
正确做法是:先收集待操作项,再统一处理;或改用支持安全擦除的模式(如 remove_if + erase)。
C++11 以后推荐用范围 for,std::for_each 更适合配合 std::bind 或函数对象复用
对简单遍历,for (const auto& x : container) 更直观、不易出错、支持 break/continue。而 std::for_each 的优势在于:可与 std::bind 组合复用逻辑,或作为高阶函数参数传递。
例如,封装一个通用打印器:
#include #include#include #include void print_with_prefix(const std::string& prefix, int x) { std::cout << prefix << x << '\n'; } int main() { std::vector v = {10, 20, 30}; auto printer = std::bind(print_with_prefix, "[LOG] ", _1); std::for_each(v.begin(), v.end(), printer); // 输出三行 [LOG] 10 等 }
真正需要 std::for_each 的地方,往往不是“怎么遍历”,而是“如何把遍历动作本身参数化或延迟执行”。否则,别硬套。
# go
# ai
# c++
# ios
# stream
# for
# while
# 封装
# const
# auto
# break
# continue
# 局部变量
# int
# volatile
# 循环
# Lambda
# 引用类型
# 泛型
# 形参
# map
# 对象
# 算法
# 迭代
# 遍历
# 复用
# 也不
# 是在
# 把它
# 不像
# 一件事
# 可达
# 不超过
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
北京专业网站制作设计师招聘,北京白云观官方网站?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何快速搭建自助建站会员专属系统?
网站建设保证美观性,需要考虑的几点问题!
开心动漫网站制作软件下载,十分开心动画为何停播?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何在服务器上配置二级域名建站?
如何快速完成中国万网建站详细流程?
如何用wdcp快速搭建高效网站?
如何破解联通资金短缺导致的基站建设难题?
米侠浏览器网页背景异常怎么办 米侠显示修复
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
佛山网站制作系统,佛山企业变更地址网上办理步骤?
制作旅游网站html,怎样注册旅游网站?
如何在万网自助建站平台快速创建网站?
jQuery中的100个技巧汇总
太平洋网站制作公司,网络用语太平洋是什么意思?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
三星、SK海力士获美批准:可向中国出口芯片制造设备
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
教你用AI润色文章,让你的文字表达更专业
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何快速搭建FTP站点实现文件共享?
如何续费美橙建站之星域名及服务?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何快速搭建高效服务器建站系统?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
利用vue写todolist单页应用
Laravel如何处理异常和错误?(Handler示例)
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
原生JS实现图片轮播切换效果
常州企业网站制作公司,全国继续教育网怎么登录?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Linux系统命令中screen命令详解
如何快速生成凡客建站的专业级图册?
b2c电商网站制作流程,b2c水平综合的电商平台?
Laravel如何实现API版本控制_Laravel版本化API设计方案
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何在阿里云虚拟主机上快速搭建个人网站?
iOS发送验证码倒计时应用
如何在阿里云完成域名注册与建站?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
大同网页,大同瑞慈医院官网?
上一篇:notepad电脑自带吗
上一篇:notepad电脑自带吗


