仿函数(function object)
来源:互联网 发布:php java混合 编辑:程序博客网 时间:2024/06/06 01:13
仿函数是行为类似函数的对象,所谓函数行为,是指可以“使用小括号传递参数,藉以调用某个东西”。
下面是仿函数定义的一般形式:
class X{public:return type operator()(参数) const{}};
下面是一个使用仿函数的简单实例:
#include<iostream>#include<list>#include<algorithm>using namespace std;template<class T>class Print{public:void operator()(T & elem)const{cout << elem << " ";}};void main(){list<int> mylist;for (int i = 1; i <= 10; i++){mylist.push_back(i);}for_each(mylist.begin(), mylist.end(), Print<int>());cin.get();}
这里Print<int>()创建一个此类别的临时对象,当作for_each的一个参数。
另外一个使用仿函数的例子:
#include<iostream>#include<list>#include<algorithm>#include<iterator>using namespace std;template<class T>class IntSequence{public:IntSequence(int initVal) :value(initVal){}int operator()(){return value++;}private:T value;};void main(){list<int> mylist;generate_n(back_inserter(mylist), 5, IntSequence<int>(1));for (auto i : mylist){cout << i << " ";}cout << "\n";generate_n(front_inserter(mylist), 5, IntSequence<int>(10));for (auto i : mylist){cout << i << " ";}cin.get();}
C++提供了许多预定义的仿函数,具体如下表:
要使用这些仿函数,必须包含头文件<functional>
默认情况,set容器是以less<>为预设准则,按从小到大排序
下面使用仿函数greater<int>对容器进行从大到小的初始化
#include<iostream>#include<set>#include<functional>using namespace std;using std::function;void main(){set<int,greater<int> > myset;for (int i = 1; i <= 10; i++){myset.insert(i);}for (auto i : myset){cout << i << " ";}cout << endl;cin.get();}
下面例子使用仿函数multiplies<type>()对容器中每个元素乘2:
#include<iostream>#include<list>#include<functional>#include<algorithm>#include<iterator>using namespace std;using std::function;void main(){list<int> mylist;for (int i = 1; i <= 5; i++){mylist.push_back(i);}for (auto i : mylist){cout << i << " ";}cout << endl;transform(mylist.begin(), mylist.end(), ostream_iterator<int>(cout, " "), bind2nd(multiplies<int>(), 2));cin.get();}
这里的bind2nd是一个函数配接器,实际上bind2nd是将一个二元仿函数(multiplies<>)转换为一元仿函数。它通常将第二参数传给“由第一参数
指出”的二元仿函数。函数配接器本身也是一个仿函数。
所谓“函数配接器”是指能够将仿函数和另一个仿函数(或某一个值,或某个一般函数)结合起来的仿函数。函数配接器也声明于<functional>.
下面的例子使用not1()和bind2nd()删除容器中的所有偶数:
#include<iostream>#include<list>#include<algorithm>#include<functional>#include<iterator>using namespace std;using std::function;void main(){list<int> mylist;for (int i = 1; i <= 10; i++){mylist.push_back(i);}for (auto i : mylist){cout << i << " ";}cout << endl;list<int>::iterator pos;pos = remove_if(mylist.begin(), mylist.end(), not1(bind2nd(modulus<int>(), 2)));mylist.erase(pos, mylist.end());for (auto i : mylist){cout << i << " ";}cin.get();}
0 0
- 仿函数(function object)
- 深入理解仿函数(functor或function object)
- c++ 仿函数(function object)和函数指针的差别
- c++ 仿函数(function object)和函数指针的差别
- 函数对象 function object
- 函数对象 function object
- 函数类function object
- 仿函数(functor function objects)
- C++函数对象 (Function object)
- 仿函数functor和function adapters
- Object-C 学习笔记(三)---函数function
- Javascript对象 Object 与函数 Function
- C++中的函数对象(Function Object)
- C++中的函数对象(Function Object)
- 认识js函数对象(Function Object)
- Function Object
- function object
- Function object
- 第九周项目六(解奥数题)
- 第九周项目六—年龄几何
- 如何进行数据同步
- Android Services Intro
- Tree命令。Win下和MAC下
- 仿函数(function object)
- Jquery .ajax方法分析
- JSP+JavaBean
- mysql服务器优化
- hibernate annotation 指定onetomany关联列名
- VelocityTracker使用
- linux下发生/bin/sh^M:bad interpreter: No such file or directory
- java项目打jar包
- Selenium的延迟等待