重载函数调用操作符的类,其对象常称为函数对象(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 之 函数对象的更多相关文章

  1. ###STL学习--函数对象

    点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...

  2. C++ STL 之 函数对象适配器

    谓词是指普通函数或重载的 operator()返回值是 bool 类型的函数对象(仿函数).如果operator 接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断 ...

  3. 条款20 STL函数对象

    继承标准STL的函数对象 1: struct PopLess : public atd::binary_function<state,state,bool> 2: { 3: bool op ...

  4. 3.2 STL中的函数对象类模板

    *: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...

  5. 【实习记】2014-08-15文档太少看着源码用cgicc+stl库之模板谓词函数对象

        总结1: 今天找到了昨天scanf的问题答案,scanf与printf一样的神奇而复杂,稍不留神,就会被坑.scanf函数在读入非空白符分割的多个字符串的解决方法是这个:/* 以 | 分割 * ...

  6. STL算法设计理念 - 预定义函数对象

    预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象 1)使用预定义函数对象: #include <iostream> #include <cstdio> #i ...

  7. STL算法设计理念 - 函数对象和函数对象当参数和返回值

    函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)&qu ...

  8. C++STL 预定义函数对象和函数适配器

    预定义函数对象和函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional> 必须包含. 1使用预定义函数对象: void ...

  9. STL——仿函数(函数对象)

    一.仿函数(也叫函数对象)概观 仿函数的作用主要在哪里?从第6章可以看出,STL所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允 ...

随机推荐

  1. 树莓派根分区扩展至整张sd卡

    第一步,安装raspi-config sudo apt-get install raspi-config 第二步,运行raspi-config sudo raspi-config 界面选择,Expan ...

  2. C++ unique

    #include <iostream>#include <algorithm>#include <list>#include <iterator>#in ...

  3. HTML-T

    a标签跳转 <a href="new_link" target="_blank">在新建页面打开链接</a>. <a href=& ...

  4. 【AMAD]django-filter -- 一个通用的,基于用户选择的Django Queryset 过滤系统

    简介 用法 和DRF集成 个人评分 简介 django-filter1可以通过URL的query string参数,动态对Queryset进行过滤. 用法 import django_filters ...

  5. Python学习笔记——pickle 模块

    由于从文本文件中读取出来的内容都会变成字符串,且转换成列表.字典等数据类型比较困难,因此采用pickle模块存储它们 import pickle my_list = [123,3.14,'小甲鱼',[ ...

  6. 【FFMPEG】Windows下使用Visual Studio 2010编译ffmpeg全过程

    原文  http://www.cnblogs.com/xylc/p/3683203.html 主题 FFmpegWindowsVisual Studio ffmpeg是一个开源的多媒体库,使用非常广泛 ...

  7. OpenGL.Qt551.问题

    1.Qt551 + vs2013 + Win7x64 缘由:将“教程14:渲染到纹理.html(http://www.opengl-tutorial.org/cn/intermediate-tutor ...

  8. Spring boot 新建项目pom.xml文件报错 Failure to transfer org.springframework.boot:spring-boot-maven-plugin

    新建项目依赖下载时网络中断导致资源损坏 删除.m2\repository中后缀名为lastUpdated的文件 cd %userprofile%\.m2\repository for /r %i in ...

  9. kafka的offset相关知识

    Offset存储模型 由于一个partition只能固定的交给一个消费者组中的一个消费者消费,因此Kafka保存offset时并不直接为每个消费者保存,而是以 groupid-topic-partit ...

  10. 剑指offer39:平衡二叉树

    1 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 2 思路和方法 平衡二叉树,又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1 ...