STL算法中函数对象和谓词
函数对象和谓词定义
函数对象:
重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。
这是通过重载类的operator()来实现的。
“在标准库中,函数对象被广泛地使用以获得弹性”,标准库中的很多算法都可以使用函数对象或者函数来作为自定的回调行为;
谓词:
一元函数对象:函数参数1个;
二元函数对象:函数参数2个;
一元谓词 函数参数1个,函数返回值是bool类型,可以作为一个判断式
谓词可以使一个仿函数,也可以是一个回调函数。
二元谓词 函数参数2个,函数返回值是bool类型
一元谓词函数举例如下
1,判断给出的string对象的长度是否小于6
bool GT6(const string &s)
{
return s.size() >= 6;
}
2,判断给出的int是否在3到8之间
bool Compare( int i )
{
return ( i >= 3 && i <= 8 );
}
二元谓词举例如下
1,比较两个string对象,返回一个bool值,指出第一个string是否比第二个短
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
- 一元函数对象例子:
- //1普通类 重载 函数调用操作符
- template <typename T>
- void FuncShowElemt(T &t) //普通函数 不能像 仿函数那样记录状态
- {
- cout << t << " ";
- };
- void showChar(char &t)
- {
- cout << t << " ";
- }
- //函数模板 重载 函数调用操作符
- template <typename T>
- class ShowElemt
- {
- public:
- ShowElemt()
- {
- n = ;
- }
- void operator()(T &t)
- {
- n++;
- cout << t << " ";
- }
- void printCount()
- {
- cout << n << endl;
- }
- public:
- int n;
- };
- //1 函数对象 基本使用
- void main()
- {
- int a = ;
- FuncShowElemt<int>(a); //普通的函数调用
- ShowElemt<int> showElemt; //函数对象
- showElemt(a); //函数对象调用
- }
- 一元谓词例子:
- //1元谓词 例子
- template <typename T>
- class Isdiv
- {
- public:
- Isdiv(const T &divisor) //
- {
- this->divisor = divisor;
- }
- bool operator()(T &t)
- {
- return (t%divisor == );
- }
- protected:
- private:
- T divisor;
- };
- void main()
- {
- vector<int> v2;
- for (int i=; i<; i++)
- {
- v2.push_back(i);
- }
- vector<int>::iterator it;
- int a = ;
- Isdiv<int> mydiv(a);
- // _InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred) //返回的是迭代器
- it = find_if(v2.begin(), v2.end(), Isdiv<int>());
- if (it != v2.end())
- {
- cout << "第一个被4整除的数是:" << *it << endl;
- }
- }
- 二元函数对象例子:
- template <typename T>
- struct SumAdd
- {
- T operator()(T &t1, T &t2)
- {
- return t1 + t2;
- }
- };
- template <typename T>
- void printE(T &t)
- {
- for (vector<int>::iterator it = t.begin(); it!=t.end(); it++ )
- {
- cout << *it << " ";
- }
- }
- void printVector(vector<int> &v)
- {
- for (vector<int>::iterator it = v.begin(); it!=v.end(); it++ )
- {
- cout << *it << " ";
- }
- }
- void main()
- {
- vector<int> v1, v2 ;
- vector<int> v3;
- v1.push_back();
- v1.push_back();
- v1.push_back();
- v2.push_back();
- v2.push_back();
- v2.push_back();
- v3.resize();
- //transform(v1.begin(), v1.end(), v2.begin(),v3.begin(), SumAdd<int>());
- /*
- template<class _InIt1,
- class _InIt2,
- class _OutIt,
- class _Fn2> inline
- _OutIt transform(_InIt1 _First1, _InIt1 _Last1,
- _InIt2 _First2, _OutIt _Dest, _Fn2 _Func)
- */
- vector<int>::iterator it = transform(v1.begin(), v1.end(), v2.begin(),v3.begin(), SumAdd<int>());
- cout << *it << endl;
- printE(v3);
- }
- 二元谓词例子:
- void current(int &v)
- {
- cout << v << " ";
- }
- bool MyCompare(const int &a, const int &b)
- {
- return a < b;
- }
- void main()
- {
- vector<int> v();
- for (int i=; i<; i++)
- {
- v[i] = rand() % ;
- }
- for_each(v.begin(), v.end(), current);
- printf("\n");
- sort(v.begin(), v.end(), MyCompare );
- printf("\n");
- for (int i=; i<; i++)
- {
- printf("%d ", v[i]);
- }
- printf("\n");
- }
STL算法中函数对象和谓词的更多相关文章
- STL 算法中函数对象和谓词
STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特 ...
- STL算法设计理念 - 函数对象和函数对象当参数和返回值
函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)&qu ...
- STL算法设计理念 - 函数对象和函数对象当參数和返回值
函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)&q ...
- 02--STL算法(函数对象和谓词)
一:函数对象(仿函数):实现状态记录等其他操作<相对于普通函数> 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象. 即是重载了“ ...
- C++STL 函数对象和谓词
函数对象:重载函数调用操作符的类,其对象常称为函数对象. 函数对象属于类对象,能突破函数概念,保持类的状态 谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个, ...
- STL 仿函数(函数对象)
##定义 仿函数(functor):一种具有函数性质的对象. 仿函数在C++中的新名称为函数对象(function object). 仿函数类对象像函数一样被调用,调用仿函数类对象时,实际调用的是仿函 ...
- STL——仿函数(函数对象)
一.仿函数(也叫函数对象)概观 仿函数的作用主要在哪里?从第6章可以看出,STL所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允 ...
- C++STL 预定义函数对象和函数适配器
预定义函数对象和函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional> 必须包含. 1使用预定义函数对象: void ...
- STL算法设计理念 - 函数适配器
1)函数适配器的理论知识 2)常用函数函数适配器 标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象.常用适配器是: 1.绑定器(binder): binder通过把二元函数对象的一个实参 ...
随机推荐
- WordCount 的实现与测试
一.开头 (1)合作者:201631062627,201631062427 (2)代码地址:https://gitee.com/catchcatcat/WordCount.git 二.正文 (1)基本 ...
- 转:JDK动态代理为什么必须用接口以及与CGLIB的对比
参考链接: JDK动态代理为什么必须用接口以及与CGLIB的对比 文章中提到:试验了JDK动态代理与CGLIB动态代理.从Spring的AOP框架介绍中得知对于使用接口的类,Spring使用JDK动态 ...
- 20165336 实验三 敏捷开发与XP实践
20165336 实验三 敏捷开发与XP实践 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:康志强 学号:20165336 指导教师:娄嘉鹏 实验日期:2018年4月28日 实验时 ...
- /var/run/utmp文件操作函数
相关函数:getutent, getutid, getutline, setutent, endutent, pututline, utmpname utmp 结构定义如下:struct utmp{ ...
- java 线程 (二) 线程池
package cn.sasa.demo2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Exec ...
- swift 桥接 Bridging 的创建和使用
swift编程时,大概率会用到OC的文件,这时就要使用swift与oc的桥接文件.桥接文件以 XXXX-Bridging-header.h 这样子的文件名形式为标准,XXXX是你的项目名字. 具体 ...
- fopen 的使用
1, fopen() 的使用,在linux环境下,我们可以使用man fopen查看使用说明: #include <stdio.h> FILE *fopen(const char *pat ...
- es修改指定的field(partial update)
PUT /index/type/id 创建文档&替换文档,就是一样的语法一般对应到应用程序中,每次的执行流程基本是这样的:1.应用程序发起一个get请求,获取到document,展示到前台界面 ...
- Python高阶函数map、reduce、filter、sorted的应用
#-*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import Web ...
- ftp工具类
package com.ytd.zjdlbb.service.zjdlbb; import java.io.File;import java.io.FileInputStream;import jav ...