概述
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上的样例使用代码:
// 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;
}
cplusplus解释原文:点击打开链接
Data Structure and Algorithm栏目中会不定期更新一些STL的应用,以及数据结构的相关内容,包括课设以及基础知识等等。
最后
以上就是年轻滑板为你收集整理的STL中的for_each()函数的全部内容,希望文章能够帮你解决STL中的for_each()函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复