函数对象Function Object

目录

一.函数对象Function Object的原理

二.使用函数对象的意义

三.实现一个函数对象Function Object完成容器元素的过滤

四.查找函数find()和find_if()的区别:


一.函数对象Function Bbject的原理

1.函数对象即为一个重载了括号 " ( ) " 的对象。当该对象调用此操作符时,其表现形式就如同普通函数的调用一般。

2.具体实现:

①.函数对象的定义:

class Fuction_object
{
public:
	bool operator() (int _value)
	{
		return val < _value;
	};
private:
	int val;
};

②.函数对象的调用:通过定义的类创建函数对象,再以一般函数调用的方式调用该函数对象

Function_object F_O(10);
F_O(5);

二.使用函数对象的意义

1.函数对象拥有自己的状态。程序员可以在类中定义状态变量,这样的一个函数对象在多次的调用中可以共享状态。(函数调用不存在这种优势)

2.函数对象有自己特有的类型,而普通函数无类型一说。(通过此特性,在使用STL中的函数时,可以传递相应的类型作为参数来实例化相应的模板,从而实现相应的功能)

eg:

class Fuction_object
{
public:
	bool operator() (int _value)
	{
		return val < _value;
	};
private:
	int val;
};

int main()
{
Function_object F_O(10);
F_O(5);

int a[5] = {10,2,4,5,9};
vector<int> vec(a,a+5);

vector<int>::iterator it = vec.begin();

int counts = 0;
while(find_if(it,vec.end(),F_0)!=vec.end()) 
{
  counts++;
  it++;
};

system("pause");
return 0;
}

通过函数对象作为<algorithm>中函数sort()的参数完成对容器中元素的过滤。

三.实现一个函数对象Function Object完成容器元素的过滤

C++实现代码:

//function_object.h

#pragma once

#ifndef _FUNCTION_OBJECT_H_
#define _FUNCTION_OBJECT_H_

class LessThan
{
private:
	int _val;
public:
	LessThan(int val) :_val(val) { }
	int comp_val1() const { return _val; }
	void comp_val2(int nval) { _val = nval; }

	bool operator() (int _value) const; //实现函数对象的根本
};


#endif


//function_object.cpp

#include"function_object.h"

bool LessThan::operator()(int _value)const
{
	return _value < _val; // _val是创建函数对象时就设定好的一个右操作数,而_value则是调用函数对象时传入的左操作数
}

//main.cpp

#include"function_object.h"
#include<algorithm> //find_if()
#include<iostream>
#include<vector>
using namespace std;


int count_less_than(const vector<int>& vec, int comp)
{
	LessThan lt(comp); //创建函数对象function object

	int counts = 0;

	for (int ix = 0; ix < vec.size(); ix++)
	{
		if (lt(vec[ix]))
		{
			counts++;
		}
	}

	return counts;
}

void print_less_than(const vector<int>& vec, int comp)
{
	LessThan lt(comp);

	vector<int>::const_iterator it = vec.begin();

	cout << "element less than " << lt.comp_val1() << endl;
	while (it != vec.end())
	{
		if ((it = find_if(it, vec.end(), lt)) != vec.end())
		{
			cout << *it << " ";
			it++;
		}
	}
}

int main()
{
	int ia[10] = { 17,12,44,27,55,8,23,9,6,14 };
	vector<int> vec(ia, ia + 10);
	int comp_val = 20;

	cout << "Number of elements less than "
		<< comp_val << " are "
		<< count_less_than(vec, comp_val) << endl;

	print_less_than(vec, comp_val);

	system("pause");
	return 0;
}

_val是创建函数对象时就设定好的一个右操作数,而_value则是调用函数对象时传入的左操作数

bool LessThan::operator()(int _value)const
{
	return _value < _val; 
// _val是创建函数对象时就设定好的一个右操作数,而_value则是调用函数对象时传入的左操作数
}

四.<algorithm>头文件中的查找函数find()和find_if()的区别:

1.find查找函数原型为find(_InIt _First, const _InIt _Last, const  _Ty& _Val)

其中

first 为迭代器起始位置

last为迭代器起始位置

val为查找数据

2.find_if查找函数原型为find_if(_InIt _First, const _InIt _Last, _Pr _Pred)

其中

first 为迭代器起始位置

last为迭代器起始位置

Pr _Pred是谓词,需要自己创建(函数对象经常用于此处)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值