C++ STL 之 函数对象
重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。
注意:1.函数对象(仿函数)是一个类,不是一个函数。2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。
假定某个类有一个重载的 operator(),而且重载的 operator()要求获取一个参数,我们就将这个类称为“一元仿函数”(unary functor);相反,如果重载的 operator()要求获取两个参数,就将这个类称为“二元仿函数”(binary functor)。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; class FuncObject01
{
public:
void operator()()
{
cout << "Hello WOrld!" << endl;
}
}; void FuncObject02()
{
cout << "Hello WOrld!" << endl;
} void test01()
{
FuncObject01 fobj;
fobj();
FuncObject02();
cout << "------------" << endl;
} class FuncObject03
{
public:
int operator()(int a, int b)
{
return a + b;
}
}; int FuncObject04(int a, int b)
{
return a + b;
} // 函数对象也可以像普通函数一样 具有返回值和参数
void test02()
{
FuncObject03 fobj;
int ret = fobj(, );
cout << "ret = " << ret << endl;
ret = FuncObject04(, );
cout << "ret = " << ret << endl;
cout << "------------------------" << endl;
} // 函数对象超出了普通函数的功能,可以具有保存函数调用状态
// 例如 我们要统计函数的调用次数 class FuncObject05
{
public:
FuncObject05() : count() {}
void operator()()
{
cout << "Hello World!" << endl;
count++;
}
int count;
}; // 普通函数统计调用次数,需要一个全局变量
int g_count = ;
void FuncObject06()
{
cout << "Hello World!" << endl;
g_count++;
} void test03()
{
FuncObject06();
FuncObject06();
cout << "函数调用次数:" << g_count << endl;
// 使用函数对象不需要使用全局变量
FuncObject05 fobj;
fobj();
fobj();
fobj();
cout << "函数调用次数:" << fobj.count << endl;
cout << "---------------------------" << endl;
} // 函数对象做参数和返回值
class print
{
public:
print() : count(){}
void operator()(const int& val)
{
cout << val << " ";
count++;
}
int count;
}; int num = ;
void print2(int val)
{
cout << val << " ";
num++;
} void test04()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
// 通过for_each算法 遍历容器元素
print myprint;
// 函数对象做返回值和参数
myprint = for_each(v.begin(), v.end(), myprint);
cout << endl;
cout << "函数调用次数:" << myprint.count << endl;
for_each(v.begin(), v.end(), print2);
cout << endl;
cout << "函数调用次数:" << num << endl;
} int main()
{
test01();
test02();
test03();
test04();
getchar();
return ;
}
C++ STL 之 函数对象的更多相关文章
- ###STL学习--函数对象
点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...
- C++ STL 之 函数对象适配器
谓词是指普通函数或重载的 operator()返回值是 bool 类型的函数对象(仿函数).如果operator 接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断 ...
- 条款20 STL函数对象
继承标准STL的函数对象 1: struct PopLess : public atd::binary_function<state,state,bool> 2: { 3: bool op ...
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
- 【实习记】2014-08-15文档太少看着源码用cgicc+stl库之模板谓词函数对象
总结1: 今天找到了昨天scanf的问题答案,scanf与printf一样的神奇而复杂,稍不留神,就会被坑.scanf函数在读入非空白符分割的多个字符串的解决方法是这个:/* 以 | 分割 * ...
- STL算法设计理念 - 预定义函数对象
预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象 1)使用预定义函数对象: #include <iostream> #include <cstdio> #i ...
- STL算法设计理念 - 函数对象和函数对象当参数和返回值
函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)&qu ...
- C++STL 预定义函数对象和函数适配器
预定义函数对象和函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional> 必须包含. 1使用预定义函数对象: void ...
- STL——仿函数(函数对象)
一.仿函数(也叫函数对象)概观 仿函数的作用主要在哪里?从第6章可以看出,STL所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允 ...
随机推荐
- cs6.8-oracle挂载ceph
https://ceph-users.ceph.narkive.com/EgcYJhbG/hammer-0-94-1-still-getting-feature-set-mismatch-for-ce ...
- org/springframework/cache/jcache/config/AbstractJCacheConfiguration.class
在使用Spring-MVC环境时 报错: Failed to parse configuration class [org.springframework.cache.aspectj.AspectJ ...
- css中em小于1时chrome字体大小和firefox字体大小不一致的问题
css中em设置为0.8,结果页面显示,chrome字体比firefox字体大了不少. chrome有默认字体大小,默认为12px.设置的字体大小小于12px时,也是按照12px来显示. firefo ...
- java+上传大文件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- 解析Python编程中的包结构
解析Python编程中的包结构 假设你想设计一个模块集(也就是一个"包")来统一处理声音文件和声音数据.通常由它们的扩展有不同的声音格式,例如:WAV,AIFF,AU),所以你可能 ...
- Vue的基础学习
一.Vue的计算属性:get和set属性 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 【leetcode_easy】543. Diameter of Binary Tree
problem 543. Diameter of Binary Tree 题意: 转换一种角度来看,是不是其实就是根结点1的左右两个子树的深度之和呢.那么我们只要对每一个结点求出其左右子树深度之和,这 ...
- ansible实践
ansible常用module ansible-doc -l List available modules -s Show playbook snippet for specified module( ...
- opengl球形网格生成
效果如图 准备第三方库 glew.freeglut.glm 代码包括主程序源文件mainApp.cpp.顶点着色器shader.vs.片元着色器shader.fs mainApp.cpp如下 #i ...
- Spark + sbt + IDEA + HelloWorld + MacOS
构建项目步骤 首先要安装好scala.sbt.spark,并且要知道对应的版本 sbt版本可以在sbt命令行中使用sbtVersion查看 spark-shell可以知晓机器上spark以及对应的sc ...