C++ 仿函数

在我们写代码时有时会发现有些功能的实现的代码,会不断的在不同的成员函数中用到,但是又不好将这些代码独立出来成为一个类的一个成员函数。但是又很想复用这些代码。写一个公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。这时就可以用仿函数了,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。这样就免去了对一些公共变量的全局化的维护了。又可以使那些代码独立出来,以便下次复用。

仿函数(functor),是通过重载()运算符模拟函数形为的类。

因此,这里需要明确两点:

1 仿函数不是函数,它是个类;

2 仿函数重载了()运算符,使得它可以像函数那样子调用(代码的形式好像是在调用函数)。

实例:

#include <iostream>
using namespace std;

class Compare
{
public:
	bool operator()(int num1, int num2) const
	{
		if (num1 <= num2)
			return true;
		else
			return false;
	}
};

void sort(int *array, int size, const Compare &cmp)
{
	if (array == NULL)
		return;

	for (int i=0; i<size-1; i++)
	{
		for (int j=0; j<=size-2-i; j++)
		{
			if (!(cmp(array[j], array[j+1])))
			{
				array[j] = array[j]^array[j+1];
				array[j+1] = array[j+1]^array[j];
				array[j] = array[j]^array[j+1];
			}
		}
	}
}

void list(const int *array, int size)
{
	if (array == NULL)
		return;

	for(int i=0; i< size; i++)
		cout << array[i] << " ";
	cout << endl;
}

int main()
{
	int array[] = {0, 9, 8, 7, 6, 5, 4, 3, 2, 1};
	sort(array, sizeof(array)/sizeof(int), Compare());
	list(array, sizeof(array)/sizeof(int));
	return 0;
}

sort()中cmp为Comparer类的一个对象,但这里的用法好像它是某个函数的样子。这就是仿函数的真谛

C++ 仿函数,布布扣,bubuko.com

时间: 2024-10-06 00:16:31

C++ 仿函数的相关文章

c++ 之定制删除器的代码实现(使用仿函数)

template<class T> struct Del {  void operator()(const T* ptr)  {   cout << "Del" <<ptr<< endl;   delete ptr;  } }; template<class T> struct FFF {  void operator()(const T* ptr)  {   cout << "delete[]"

Functor仿函数

转载声明:本文转自网络,稍加整理以备学习和参考之用. 函数对象/仿函数 提到C++ STL,首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭代器和算法.容器为用户提供了常用的数据结构,算法大多是独立于容器的常用的基本算法,迭代器是由容器提供的一种接口,算法通过迭代器来操控容器.接下来要介绍的是另外的一种组件,函数对象(Function Object,JJHou译作Functor仿函数). 什么是函数对象 顾名思义,函数对象首先是一个对象

C++ STL 学习 :for_each与仿函数(functor)

简单来将,仿函数(functor)就是一个重载了"()"运算符的struct或class,利用对象支持operator()的特性,来达到模拟函数调用效果的技术. 我们平时对一个集合类遍历的时候,例如vector,是这样做的: for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); ++iter) { //do your whatever you want here } 例如下面的代码:

仿函数

1.仿函数   本质:是一个对象,用起来像函数:   原因:在类内对()进行了重载: 2.绑定器和取反器 (1).绑定器:把二元函数对象中一个参数固定,使之转为一元函数,C++标准库中提供了2种预定义的binder适配器,bind1st.bind2nd,分别绑定了第一个/第二个参数: (2).取反器:翻转的适配器: (3).一元函数:只针对一个参数,只有一个返回值: 二元函数:针对2个参数,只有一个返回值: (4).绑定器针对的是参数,绑定后其值就不变了,取反器对其进行取反:   (5).可以通

[GeekBand] STL 仿函数入门详解

本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite.com/ 前言:本文主要通过关联容器set解释下仿函数的实现及工作原理. 一.STL六大组件简介 1.Containers(容器):各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据2.Algorithms(算法):如. Sort,Search.3.Iterators(

函数对象(仿函数 functor)

简单地说,函数对象就是一个重载了()运算符的类实例,它可以像一个函数一样使用. #include <iostream> using namespace std; class Add { public: int operator ()(const int &a, const int &b) { return (a + b); } double operator ()(const double &a, const double &b) { return (a + b

stl仿函数和适配器

所谓的适配器就是底层利用仿函数,然后修改仿函数的接口,达到自己的目的: 例如:template<class operation> class binder1st的适配器,其本质是一个类,它的模板参数operation其实是仿函数类(仿函数其实是struct类),内部函数调用operator()(const typename Operation::second_argument_type& x) const,其中x是我们适配器调用的参数,由于此适配器的目的就是绑定第一个参数,使得我们的调

C++STL:仿函数

C++仿函数应用实例 #include <iostream> #include <list> #include <algorithm> using namespace std; template<class T> struct GT { GT (const T& a) : m_a(a) {} bool operator()(const T& left) { return left >= m_a; } T m_a; }; int main

STL C++ std::bind操作例子,仿函数操作配合算法库操作

1.stl::bind 和std::mem_fun_ref系列的配合使用出现了问题,多参形式不知道如何组织.适配器的操作真心难受!!!只能迷迷糊糊地用着.要使用非质变算法时需要作用于容器时只能考虑lambda或者transfer操作.待续 // functor-adapter_p431.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <algorithm>//元素操作算法 #include <functiona

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数

 1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器) STL的六大组件分别是: 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adapter) 空间配置器(allocator):只能分配内存等 2.容器与算法 案例如下: #include<