函数对象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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: riptable 这个错误提示通常出现在JavaScript中,意思是“函数对象不可订阅”。它通常出现在你试图访问一个函数对象的属性或方法时,但该函数对象并没有这个属性或方法。可能是因为你的代码中有拼写错误或逻辑错误,导致函数对象没有正确定义。建议检查代码中的拼写和逻辑错误,确保函数对象被正确定义。 ### 回答2: "function object is not subsc" 这个错误信息通常是在使用函数对象时出现的。它的意思是函数对象不支持直接通过下标来访问其元素。 在Python中,函数也被视为对象,可以像其他对象一样进行操作。但是,与列表或字典等对象不同,函数对象并不支持通过下标来访问其元素,因为函数对象没有内置的索引机制。 如果你尝试通过下标访问函数对象,Python解释器会抛出"function object is not subsc"这个错误。例如,如果你尝试像下面这样访问函数对象的某个元素: ```python def my_function(): ... print(my_function[0]) # 这里会抛出"function object is not subsc"错误 ``` 为了解决这个问题,你可以使用函数对象的其他属性和方法来操作它。例如,你可以直接调用函数对象以执行函数的操作,例如: ```python def my_function(): ... result = my_function() # 调用函数对象执行函数操作 ``` 另外,你还可以使用内置的函数`dir()`来查看函数对象的所有属性和方法。例如: ```python def my_function(): ... print(dir(my_function)) # 打印函数对象的所有属性和方法 ``` 总之,"function object is not subsc"错误的意思是函数对象不支持通过下标直接访问其元素,你需要使用其他合适的方法来操作函数对象。 ### 回答3: "function object is not subscriptable"这个错误信息通常出现在尝试对一个函数对象进行下标操作时。函数对象是不可迭代的,它的本质是一个可调用的对象,并不是一个包含元素的容器。 当我们使用下标操作符[]来访问一个对象时,Python会尝试在该对象上调用__getitem__()方法来获取指定下标位置的元素。然而,对于函数对象而言,并没有实现__getitem__()方法,因此会引发"function object is not subscriptable"错误。 要解决这个问题,我们需要检查代码中是否存在对函数对象的不正确使用。如果我们需要在函数调用时传递参数,可以直接使用函数名加括号的方式进行调用,而不是使用下标操作符。例如,正确的调用一个函数可以这样做:function_name()。 此外,也要确保我们不会错误地把函数当作一个包含元素的列表或字典来使用。如果我们需要存储和处理多个函数对象,可以考虑使用列表或字典来保存这些函数,并使用合适的索引或键来访问相应的函数。例如,可以使用function_list[0]()来调用列表中的第一个函数。 总之,"function object is not subscriptable"错误提醒我们不能对函数对象使用下标操作符[],而应该使用正确的函数调用方式来执行函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值