C++ STL 遍历算法详解:for_each

需积分: 0 0 下载量 196 浏览量 更新于2024-08-04 收藏 21KB DOCX 举报
"这篇文档是关于C++中常用遍历算法的学习笔记,主要涵盖了`for_each`和`transform`这两个算法。文档详细介绍了这两个算法的功能、使用方法以及示例代码,旨在帮助读者掌握C++中的遍历操作。" 在C++编程中,STL(Standard Template Library,标准模板库)提供了大量的高效算法,方便程序员处理各种数据结构。`algorithm`头文件是STL中不可或缺的一部分,包含了丰富的排序、查找、遍历等操作。`<functional>`头文件则定义了函数对象,而`<numeric>`头文件提供了一些序列上的数学运算模板函数。 **5.1 常用遍历算法** **5.1.1 for_each** `for_each`算法是用于遍历容器中所有元素的工具,它接受三个参数:一个开始迭代器,一个结束迭代器,以及一个函数或函数对象。这个函数或函数对象会在遍历过程中对每个元素执行一次。例如,下面的代码展示了如何使用`for_each`遍历一个`vector<int>`并打印其元素: ```cpp vector<int> v; for (int i = 0; i < 10; i++) { v.push_back(i); } for_each(v.begin(), v.end(), print01); // 使用普通函数 cout << endl; for_each(v.begin(), v.end(), print02()); // 使用仿函数(function object) cout << endl; ``` 在这段代码中,`print01`是普通函数,而`print02`是一个仿函数,两者都实现了打印元素的功能。`for_each`可以接受这两种形式的参数,使得遍历操作更为灵活。 **5.1.2 transform** `transform`算法则更加复杂,它不仅可以遍历容器,还可以将遍历的结果应用到另一个容器上。它接受四个参数:两个迭代器分别代表源容器的开始和结束,另一个迭代器代表目标容器的开始,最后是一个函数或函数对象。例如,可以使用`transform`将一个整数向量转换为其平方值的向量: ```cpp vector<int> v_src, v_dst; for (int i = 0; i < 10; i++) { v_src.push_back(i); } transform(v_src.begin(), v_src.end(), v_dst.begin(), [](int val) { return val * val; }); ``` 这里的匿名函数`[](int val) { return val * val; }`实现了将元素平方的操作,`transform`会将结果存入`v_dst`中。 **总结** `for_each`和`transform`都是C++中非常实用的遍历算法。`for_each`适用于对容器的所有元素执行相同操作,而`transform`则允许将原容器的元素转换为新的形式存储在另一个容器中。在实际开发中,掌握这两个算法可以提高代码的可读性和效率。为了更好地应用这些算法,开发者应熟悉C++的迭代器和函数对象的概念,并能灵活运用它们来实现各种遍历操作。