函数对象

函数对象

重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。这是通过重载类的operator()来实现的。

  函数对象更重要的作用是实现函数回调,可以替代指针实现函数回调。

定义如下:

复制代码
struct int_max
{
    int operator()(int x,int y)
    {
        return x>y?x:y;
    }
};
复制代码

  调用时生成一个对象:

    int_max int_max1;
    cout<<int_max1(3,6)<<endl;

  其中int_max1(3,6)的调用不是函数形式,而是int_max1.operator()(3,6);

  通常函数对象中不定义构造函数和析构函数,因此在这创建和销毁过程中不会出现任何问题。

  而且还可以通过模板实现多样性。

  类声明如下:

复制代码
class T_max
{
public:
    template <class T>
    T operator()(T x,T y)
    {
        return x>y?x:y;
    }
};
复制代码

  函数定义如下:

template <class T>
void max_test(T a,T b,T_max &ma)
{
    cout<<ma(a,b)<<endl;
}

  使用如下:

    T_max max1;
    cout<<max1(3,6)<<endl;
    max_test(12,77,T_max());//这里也可以使用临时对象

  函数对象的使用,比指针安全多了,以后函数回调时可使用其替代函数指针。

 
 

STL

 
摘要: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待。这是通过重载类的operator()来实现的。 函数对象更重要的作用是实现函数回调,可以替代指针实现函数回调。定义如下:struct int_max{ int operator()(int x,int y) { return x>y?x:y; }}; 调用时生成一个对象: int_max int_max1; ...阅读全文
posted @ 2013-09-28 10:38 slq0378 阅读(190) | 评论 (0) 编辑
 
摘要: STL中算可以分为三种, 1、变序型队列算法,可以改变容器内的数据; 2、非变序型队列算法,处理容器内的数据而不改变他们 ; 3、通用数值算法,这涉及到很多专业领域的算术操作,这里不做介绍。 第一是变序型算法,这种算法可以改变容器内的数据,而且可以只对容器的一部分数据进行操作。常用的有copy,reverse,swap,replace等,用法如下: 首先看看copy函数,是将某一范围的数据拷贝到新的容器中_OutIt copy(_InIt _First, _InIt _Last,_OutIt _Dest); // copy [_First, _Last) to [_Dest...阅读全文
posted @ 2013-09-27 17:54 slq0378 阅读(327) | 评论 (0) 编辑
 
摘要: 栈stack 、队列queue 和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现。 stack 先进后出 queue 先进先出 priority_queue 按优先级出队 代码示例如下: 1 #include "iostream" 2 using namespace std; 3 #include "string" 4 #include "stack" 5 #include "queue" 6 7 i阅读全文
posted @ 2013-09-26 17:58 slq0378 阅读(14) | 评论 (0) 编辑
 
摘要: Maps是一种关联式容器,包含“关键字/值”对。Multimaps和maps很相似,但是MultiMaps允许重复的元素。 简单介绍:1、声明,首先包含头文件 “map” map test1,test2;// map ::iterator it1,it2;//迭代器 multimap test3; multimap ::iterator it3;2、插入数据,可使用三种方法: 第一种,使用pair函数 test1.insert(pair(1,"song")); test1.insert(pair(2,"zhang")); test1.insert...阅读全文
posted @ 2013-09-26 17:29 slq0378 阅读(14) | 评论 (0) 编辑
 
摘要: 集合(Set)是一种包含已排序对象的关联容器。多元集合(MultiSets)和集合(Sets)相像,只不过支持重复对象,其用法与set基本相同。 用法介绍 1.insert()函数 首先把头文件set包含进去#include "set" set test1; set ::iterator it1; multiset test2; multiset ::iterator it2; ////////////////////////////////////////////////////////////////////////// //输入 it...阅读全文
posted @ 2013-09-26 14:55 slq0378 阅读(17) | 评论 (0) 编辑
 
摘要: 看这一节,是为了下一节的使用,在ogre3d里有些操作要使用到deque。C++ Deque(双向队列) 的使用 Deque结合了vector 和list 优缺点,是一种使用简单的容器。 deque 的特点: (1) 随机访问方便,即支持[ ] 操作符和vector.at() ,但性能没有vector 好; (2) 可以在内部进行插入和删除操作,但性能不及list ; (3) 可以在两端进行push 、pop ; (4) 相对于verctor 占用更多的内存。 常用的函数和list的基本相同,除了个别的几个,如 1、创建一个新双向队列 ,构造函数很...阅读全文
posted @ 2013-09-12 00:00 slq0378 阅读(19) | 评论 (0) 编辑
 
摘要: List --- 双向列表 List是线性列表结构,数据查找需要一个接一个,不能直接得到元素地址,检索时间与目标元素的位置成正比。但是插入数据比较快,可以在任何位置插入数据或者删除数据。list特点是: (1)不使用连续的内存空间这样可以随意地进行动态操作; (2)可以在内部任何位置快速地插入或删除,当然也可以在两端进行push和pop 。 (3)不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() ;大多数函数和vector的类似,这里就不解释了,有几个不一样的如下: merge() 合并两个list --- 链接之后会把第二个链表删除掉 void merg...阅读全文
posted @ 2013-09-08 22:19 slq0378 阅读(317) | 评论 (0) 编辑
 
摘要: C++STL(Standard Template Library)标准模板库是通用类模板和算法的集合。包含一些标准的数据结构的实现如queues(队列),lists(链表),stacks(栈)等。STL提供了以下三类数据结构的实现: 标准容器类:顺序性容器vector从后面快速插入和删除,直接访问任何元素deque从前面或后面快速插入和删除,直接访问任何元素list双链表,从任何地方快速插入和删除容器适配器statck后进先出queue先进后出priority_queue最高优先级元素总是第一个出列关联容器set快速查找,不允许重复值multiset快速查找,允许重复值map一对多映射,基于.阅读全文
posted @ 2013-09-07 19:53 slq0378 阅读(265) | 评论 (0) 编辑
原文地址:https://www.cnblogs.com/Leo_wl/p/3344745.html