for_each()函数是C++ STL中的一个遍历函数,函数原型如下:
for_each(InputIterator first, InputIterator last, Function functor);
一般情况下使用的时候都是把first作为容器遍历的起始点指针,last是容器的末尾。重点提到的是functor(仿函数)。
仿函数是一种在模板类编程时的封装手法,本质上的仿函数是一种类(class)。但是实际起到的是一种函数的作用,在这个所谓的class中通常都是一个operator()的重载,这个重载是根据programmer的需求产生的,通过调用类的构造函数就使得这个类有了函数的行为。进一步的解释就是,在写代码的时候,总有一部分代码的重用率非常高,通常的情况下我们会把这段代码写成一个顶层函数放在类外,任何的成员函数都可以去调用或访问,但是在编写代码的同时也会产生大量的全局变量,很难维护。为了提高代码的内聚度,我们选择将这部分代码封装到一个类中,通过调用类的含参或默认构造函数来执行这段代码,我们将这种做法成为仿函数。
仿函数的机制为编写代码提供了很好的有利于资源管理的手段,如果得到恰当应用的话会写出质量很高的代码。
那么我们回过头来看看for_each(),for_each()具有如下的特性:
i. for_each()对当前[begin, end)范围内的所有成员进行访问;
ii. 仿函数对每个成员进行相应操作;
iii. for_each()返回functor的一个副本;
iv. for_each()忽略functor的任何返回值;
v. 算法时间复杂度为 O(n),n为容器中的变量数目.
特性 iii 和 iv 在写的时候不太好理解,个人的思路是for_each()的返回值需要用户使用一个相同类型的变量进行记录,函数本身忽略仿函数对当前参量的任何处理,也就是说无法记录参量的最终状态。
下面贴上一段选自cplusplus.com上的样例使用代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29// for_each example #include <iostream> // std::cout #include <algorithm> // std::for_each #include <vector> // std::vector void myfunction (int i) { // function: std::cout << ' ' << i; } struct myclass { // function object type: void operator() (int i) {std::cout << ' ' << i;} } myobject; int main () { std::vector<int> myvector; myvector.push_back(10); myvector.push_back(20); myvector.push_back(30); std::cout << "myvector contains:"; for_each (myvector.begin(), myvector.end(), myfunction); std::cout << 'n'; // or: std::cout << "myvector contains:"; for_each (myvector.begin(), myvector.end(), myobject); std::cout << 'n'; return 0; }
Data Structure and Algorithm栏目中会不定期更新一些STL的应用,以及数据结构的相关内容,包括课设以及基础知识等等。
最后
以上就是年轻滑板最近收集整理的关于STL中的for_each()函数的全部内容,更多相关STL中内容请搜索靠谱客的其他文章。
发表评论 取消回复