c++如何使用std::for_each遍历容器

来源:我的博客作者:缅甸程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《c++如何使用std::for_each遍历容器》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《c++如何使用std::for_each遍历容器》有用,将其分享出去将是对创作者最好的鼓励。

std::for_each是C++标准库头文件中提供的通用遍历算法,能够对指定范围内的元素执行相同的操作,适配vector、list、map等各类标准容器,是替代传统for循环遍历的常用方案。

c++如何使用std::for_each遍历容器

std::for_each基本语法

std::for_each的函数原型如下:

template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);

参数说明:

  • first:遍历范围的起始迭代器,指向第一个要处理的元素
  • last:遍历范围的结束迭代器,指向最后一个要处理元素的下一个位置,属于左闭右开区间
  • f:要执行的回调函数,可以是普通函数、函数对象、lambda表达式,接收单个参数,参数类型为容器元素的类型

返回值:返回传入的回调函数f,方便后续链式调用。

不同场景下的使用方式

1. 配合普通函数使用

定义普通函数作为回调,处理容器中的每个元素:

#include <algorithm>
#include <vector>
#include <iostream>

// 普通函数,打印int元素
void print_int(int num) {
    std::cout << num << " ";
}

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    // 遍历vector,对每个元素执行print_int
    std::for_each(vec.begin(), vec.end(), print_int);
    // 输出结果:1 2 3 4 5
    return 0;
}

2. 配合函数对象使用

函数对象即重载了operator()的类实例,可以携带状态:

#include <algorithm>
#include <vector>
#include <iostream>

// 函数对象,累计元素总和
class SumCalculator {
public:
    SumCalculator() : total(0) {}
    void operator()(int num) {
        total += num;
    }
    int get_total() const {
        return total;
    }
private:
    int total;
};

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    SumCalculator calculator;
    // 遍历并累计总和
    SumCalculator result = std::for_each(vec.begin(), vec.end(), calculator);
    std::cout << "总和:" << result.get_total() << std::endl;
    // 输出结果:总和:15
    return 0;
}

3. 配合lambda表达式使用

lambda表达式是日常开发中最常用的方式,代码更简洁:

#include <algorithm>
#include <vector>
#include <iostream>
#include <string>

int main() {
    std::vector<std::string> str_vec = {"hello", "world", "cpp"};
    // lambda表达式作为回调,拼接字符串
    std::string combined;
    std::for_each(str_vec.begin(), str_vec.end(), [&combined](const std::string& s) {
        combined += s;
        combined += " ";
    });
    std::cout << "拼接结果:" << combined << std::endl;
    // 输出结果:拼接结果:hello world cpp 
    return 0;
}

遍历关联容器的注意事项

遍历map、set等关联容器时,元素类型是键值对,需要注意回调参数的类型:

#include <algorithm>
#include <map>
#include <iostream>

int main() {
    std::map<int, std::string> id_name_map = {
        {1, "张三"},
        {2, "李四"},
        {3, "王五"}
    };
    // 遍历map,回调参数类型为std::pair<const int, std::string>
    std::for_each(id_name_map.begin(), id_name_map.end(), [](const std::pair<const int, std::string>& item) {
        std::cout << "id:" << item.first << ",姓名:" << item.second << std::endl;
    });
    return 0;
}

适用场景与注意事项

std::for_each适合需要对容器内所有元素执行相同操作的场景,相比传统for循环,语义更明确,减少迭代器操作出错的概率。需要注意遍历区间是左闭右开,不要传入错误的迭代器范围,同时回调函数如果不需要修改元素,建议加上const修饰,避免意外修改元素值。

std::for_eachC++容器遍历算法修改时间:2026-07-18 07:57:20

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。