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所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允 ...
随机推荐
- vps虚拟机df -h根分区100%
前言:今天上午接到一个网友的求助,说是服务器的根分区满了.但是,找不到具体的大文件在哪里.由于故障确实很古怪,我就要来了故障服务器的相关账户密码. 故障服务器相关环境: 系统:Centos 6.5 s ...
- yum命令配置及使用说明和常见问题处理
一. 重装yum 1. 执行如下命令,卸载yum命令程序 rpm -qa |grep yum |xargs rpm -e --nodeps 2. 依次执行如下命令,下载yum.yum-plugin-f ...
- ES6重要点学习
1.解析赋值: let [a,b,c,d,e] = '我是中国人' //我 a = wo let [a,b,c] = 123 // 出错,Numberbu不允许解析不允许解析 2.数据集合Set, m ...
- 通过route指令指定笔记本同时连接外网和内网
假如你的外网网关是:X.X.X.X 内网网关:192.168.1.1 则在命令窗口输入以下两条命令: route add 0.0.0.0 mask 0.0.0.0 X.X.X.X route add ...
- webview的学习总结:
1.1: Weview常见的坑 及其 内存泄漏的解决方案: WebView 1. WebView常见的坑 API 16之前版本存在远程代码执行漏洞,该漏洞源自于程序没有正确限制使用WebView.ad ...
- Java工程师学习指南第3部分:Spring与SpringMVC源码解析
本文整理了微信公众号[Java技术江湖]发表和转载过的Spring全家桶优质文章,想看到更多Java技术文章,就赶紧关注吧. 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈? ...
- 【ARM-Linux开发】Linux链接 -ln
ln命令是Linux中的一个非常重要的命令,它为一个文件在另一位置创建同步链接,有两种:符号链接和硬链接. [ln命令详解]ln [options] source dist 常用参数: -f : 链接 ...
- CentOS 部署 MongoDB(旧)
下载安装包: $ cd /usr/local/src $ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.9.tgz 解压 ...
- 46.前端html5标签学习
HTML:TR TD TH OL UL LI 这几个标签要区别 一.什么是HTML: 超文本标记语言(HyperText Markup Language),标准通用标记语言下的一个应用: 是 ...
- list列表相关操作
] ] ] : :-]print(s10)# a.sort(reve# rse=True)# print(a)# a.reverse()# print(a) lst = [], 'wusir','cg ...