c++中如何使用std::for_each遍历容器_c++迭代器算法用法【实例】

发布时间 - 2026-01-25 00:00:00    点击率:
std::for_each是中的泛型算法,本质为函数调用而非循环语法糖,接收迭代器区间和可调用对象,对每个元素执行一次,无break/continue、不返回中间状态

,强调副作用明确的扁平逻辑。

std::for_each 本质是函数调用,不是循环语法糖

std::for_each 中的泛型算法,它接收一对迭代器和一个可调用对象,对区间内每个元素执行该可调用对象。它不提供“跳出”或“跳过”的能力(不像 breakcontinue),也不返回中间状态 —— 执行完就结束,返回传入的函数对象(常被忽略)。

常见误解是把它当 for 循环的替代写法,但实际它强调「对每个元素做一件事」的语义,适合副作用明确、逻辑扁平的场景(如打印、更新、收集日志)。若需条件中断、索引访问或提前退出,应优先考虑传统 forwhile 循环。

正确传参:迭代器范围必须合法,函数对象要能接受解引用类型

传给 std::for_each 的两个迭代器必须构成有效左闭右开区间(first 可达 last,且 last 不可解引用)。函数对象参数的形参类型必须与容器元素类型兼容(自动推导,但常因 const/volatile/引用修饰出错)。

  • std::vector,lambda 形参用 intconst int&int& 都合法;用 int&& 会编译失败
  • std::map,元素类型是 std::pair,不能直接用 auto& key 拆包 —— 必须解构 pair 或用结构化绑定(C++17+)
  • 若容器为空,first == laststd::for_each 不执行任何调用,安全

常见错误:捕获变量生命周期、修改容器导致迭代器失效

在 lambda 中通过引用捕获局部变量时,必须确保 lambda 的生命周期不超过该变量;更危险的是在遍历过程中修改容器大小(如 push_backerase),这会使所有现存迭代器失效,std::for_each 行为未定义。

以下示例看似自然,实则危险:

std::vector v = {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会话管理与自定义驱动配置【详解】  大同网页,大同瑞慈医院官网?