1、函数对象

函数对象是STL提供的第四类主要组件,它使得STL的应用更加灵活方便,从而增强了算法的通用性。大多数STL算法可以用一个函数对象作为参数。所谓“函数对象”其实就是一个行为类似函数的对象,它可以不需要参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。

在c++程序设计中,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,因此都可以作为函数对象传递给算法作为参数使用。

以数值算法accumulate()为例子,介绍函数对象的设计及应用过程。

数值算法accumulate()的调用格式包括两种:第一种调用格式是以"+"运算符作为运算规则,第二种算法允许用户铜鼓哦传递给算法相应的函数对象来指定计算规则。

一般来说,用户设计的普通函数就是一种最简单的函数对象,

例子1:利用普通函数来定义函数对象

#include<iostream>

#include<numeric>  //包含数值算法头文件

using namespace std;

int mutl(int x, int y)

{ return x + y; }//定义一个普通函数

int main() {

int A[] = {1,2,3,4,5};

const int N = sizeof(A) / sizeof(int);

cout << "The result by multipling all elements in A is"   << accumulate(A, A + N, 1, mutl);

getchar();

cout<<endl;//将普通函数mutl传递给通用算法

}

除了普通函数,另一类函数对象可以是类的对象,并且在定义中重载函数调用运算符。

例子2:改写上面的程序

#include<iostream>

#include<numeric>  //包含数值算法头文件

using namespace std;

class multclass   //定义multclass类

{ public:

int operator()( int x, int y )const{return x*y; }//重载操作符operator()

};

int main()

{

int A[] = { 1, 2, 3, 4, 5 };

const int N = sizeof(A) / sizeof(int);

cout << "The result by multipling all elements in A is"   << accumulate(A, A + N, 1, multclass());//将类multclass传递给通用算法

getchar();

cout << endl;//将普通函数mutl传递给通用算法

}

分析:通过在类multclass中重载运算符operator(),就定义了一种可以作为函数参数的对象,同样可以像使用普通函数mutl一样来使用该对象。但是这里传递给算法accumulate的对象是通过multclass类的默认构造函数multclass()获得的,它可以由编译器自动提供。使用类的形式定义的函数对象能够比普通函数携带更多的额外信息。

除了上面之外,STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算数运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包含头文件<functional>。标准函数对象是内连函数。

2、函数适配器

与前面介绍过的迭代器适配器的作用类似,函数适配器也可以帮助创建种类更多的函数对象。与直接铜鼓哦结构或类定义来创建新的函数对象相比,使用函数适配器是一种更加容易的方式。

8、泛型程序设计与c++标准模板库5.函数对象的更多相关文章

  1. 8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语

    有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库( ...

  2. 8、泛型程序设计与c++标准模板库4.标准c++库中的算法

    标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板. 算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置.迭代器查找元素的位置并将这些信息提供给算法以便算法能够 ...

  3. 8、泛型程序设计与c++标准模板库2、c++标准模板库中的容器

    顺序容器类以逻辑线性排列方式存储元素,在这些容器类型中的元素在逻辑上被认为是连续的存储空间中存储的.顺序容器可用于存储线性群体. 在关联容器类中,元素的存储和检索基于关键字和元素与其他元素之间的关系, ...

  4. C++学习笔记53:泛型程序设计与C++标准模板库

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...

  5. 8、泛型程序设计与c++标准模板库2.5容器适配器

    容器适配器是用来扩展7中基本容器的,是修改和调整其他类接口的类.他们不提供存放数据的实际数据结构的实现方法,而且容器适配器也不支持迭代器. 1.标准栈容器 使用STL中的标准栈为程序员提供了一层附加的 ...

  6. 8、泛型程序设计与c++标准模板库3.迭代器

    理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...

  7. 8、泛型程序设计与c++标准模板库2.3双端队列容器

    双端队列容器是一种放松了访问权限的队列.除了从队列的首部和尾部访问元素外,标准的双端队列也支持通过使用下标操作符"[]"进行直接访问. 它提供了直接访问和顺序访问方法.其头文件为& ...

  8. 8、泛型程序设计与c++标准模板库2.2向量容器

    向量容器属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问).这一点与c++语言支持的基本数组类型相同,但基本数据类型不是面向对象的.而面向对象的向量是动态结构 ...

  9. 第十章 泛型程序设计与C++标准模板库 泛型程序设计及STL的结构

随机推荐

  1. 319 Python基础之格式化输出、逻辑运算符、编码、in not in、while else、

    一.格式化输出 占位符%,字符串占位符%s,数字占位符%d 第一种name = input('姓名') age = input('年龄') hobby = input ("爱好") ...

  2. Java+MySql图片数据保存

    之前一直没有做过涉及到图片存储的应用,最近要做的东东涉及到了这个点,就做了一个小的例子算是对图片存储的初试吧! 1.创建表: drop table if exists photo; CREATE TA ...

  3. Codeforces Round #335 (Div. 2) C. Sorting Railway Cars

    C. Sorting Railway Cars time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  4. linux 文件存取 软硬联接的区别

    一.linux文件存取过程 在linux系统中根目录是自引用的,比如要找 /etc/sysconfig/networkscripts/ifcfg-0文件 先根据根目录/ 的inode号,在inode ...

  5. 用eclipse写xml文件

    1. 2.把写好的xml文件粘贴到src文件夹中.

  6. Angular-ui-router路由,View管理

    ui-router的工作原理非常类似于Angular的路由控制,他只关注状态. Angular模板 最简单的模板,例如main.html: <body data-ng-app="myA ...

  7. Python基础之列表操作

    列表的常用操作包括但不限于以下操作: 列表的索引,切片,追加,删除,切片等 这里将对列表的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 type(list) 使 ...

  8. 快速构建hibernate框架

    手动配置Hibernate框架的配置,极易出现问题,在Eclipse的web项目中,我们可以快速配置,方便快捷 一.导入Hibernate框架所需要的jar文件 二. 窗口—Perspective—打 ...

  9. 【leetcode刷题笔记】Validate Binary Search Tree

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  10. ffpanel --ffmpeg的GUI,让ffmpeg离开黑黑的命令行

    程序及源码下载地址 :https://github.com/langsim/ffpanel   from:http://blog.csdn.net/langsim/article/details/47 ...