Sword STL之仿函数概念介绍
--介绍
函数和类似函数的对象(仿函数)遍布STL。关联容器使用它们来使元素保持有序;find_if这样的算法使用它们来控制它们的行为;
如果缺少它们,那么比如for_each和transform这样的组件就没有意义了;比如not1和bind2nd这样的适配器会积极地产生它们。
--定义
仿函数(functor)就是一个重载了"()"运算符的struct或class(基本上使用struct),利用对象支持operator()的特性,来达到模拟函数调用效果的技术。
仿函数的相应型别主要用来表现函数参数型别和传回值型别。为了方便起见,<functional>定义了两个基类,分别代表一元仿函数(unary_function)和二元
仿函数(binary_function)(STL不支持三元仿函数)当然我们也可以不继承这两个基类,只要实现"()"运算符重载即可
--详解
STL函数对象在函数指针之后成型,所以STL中的习惯是当传给函数和从函数返回时函数对象也是值传递的(也就是拷贝),
函数对象的值拷贝暗含以下两个要求:
第一,你的函数对象应该很小。否则它们的拷贝会很昂贵。
第二,你的函数对象必须单态(也就是,非多态,纯函数)——它们不能用虚函数。那是因为派生类对象以值传递代入基类类型的参数会造成切割问题,在拷贝时,它们的派生部分被删除。
纯函数的定义
纯函数是返回值只依赖于参数的函数。如果f是一个纯函数,x和y是对象,f(x, y)的返回值仅当x或y的 值改变的时候才会改变。
在C++中,由纯函数引用的所有数据不是作为参数传进的就是在函数生存期内是常量。(一般,这样的常量应该声明为const。)
//非纯函数例子
int func1(int x)
{
/*
这并非一个纯函数,因为有a这个静态变量,每一次调用func1,a的值都会发生变化
即使每次x是相同的,但是返回值是不同的
*/
static int a = ;
a++;
return x + a;
}
Sword STL之仿函数概念介绍的更多相关文章
- C++_标准模板库STL概念介绍2-泛型编程
有了之前使用STL的经验后,接下来讨论泛型编程及其底层的理念: 首先我们知道STL只是泛型编程的一种: 而面向对象的编程方式关注的是编程的数据方面: 而泛型编程关注的是算法: 但是,他们之间的一个重要 ...
- C++_标准模板库STL概念介绍5-其他库与总结
C++还提供了其他一些类库,这些类库更加专用. 例如,头文件complex为复数提供了类模板complex,包含用于float.long和long double的具体化. 这个类提供了标准的复数运算以 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...
- Linux LVM硬盘管理之一:概念介绍
一.LVM概念介绍: LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻 ...
- Java SE/ME/EE的概念介绍
转自 Java SE/ME/EE的概念介绍 多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用. ...
- rocketMq概念介绍
rocketMq官网 http://rocketmq.apache.org/ rocketMq逻辑概念介绍 rocketMq逻辑图 备注: 改图片分享自李占卫的网上家园 说明: 在rocketM ...
- java 并发多线程 锁的分类概念介绍 多线程下篇(二)
接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...
- Airflow Python工作流引擎的重要概念介绍
Airflow Python工作流引擎的重要概念介绍 - watermelonbig的专栏 - CSDN博客https://blog.csdn.net/watermelonbig/article/de ...
- spring batch (一) 常见的基本的概念介绍
SpringBatch的基本概念介绍 内容来自<Spring Batch 批处理框架>,作者:刘相. 一.配置文件 在项目中使用spring batch 需要在配置文件中声明: 事务管理器 ...
随机推荐
- 启动 angular-phonecat 项目时出现这玩意 。('The header content contains invalid characters');
最近学习angular, 跟着视频做一个动作,启动 “ angular-phonecat ” 这个项目 敲入 “npm start ” 启动没有问题,但是 "http://localhost ...
- 智能引导式报错(Class file name must end with .class)
转自:http://blog.sina.com.cn/s/blog_8e761c110101dyj3.html 在使用Eclipse时,有时会出现这样的错误,在使用智能引导式会报错An interna ...
- UISwipeGestureRecognizer 左右事件捕捉
转自:http://blog.163.com/china_uv/blog/static/117137267201252102612185/ UISwipeGestureRecognizer 左右事件相 ...
- HTML5学习笔记(十):CSS常用操作
对齐 在 CSS 中,可以使用多种属性来水平对齐元素. 水平对齐 使用 margin 属性来水平对齐,可通过将左和右外边距设置为 "auto",来对齐块元素. 把左和右外边距设置为 ...
- close Spark Streaming gratefully
https://blog.csdn.net/u010454030/article/details/78679930 https://blog.csdn.net/u010454030/article/d ...
- 每日英语:Chinese Show Global Real-Estate Appetite
Chinese investors have been snapping up real estate in the world's most important cities this year. ...
- python(46):对字典进行排序,多键值排序
注:改于2017-12-07,python3 下 Removed dict.iteritems(), dict.iterkeys(), and dict.itervalues(). Instead: ...
- linux命令(39):shell 打印偶数行,奇数行 ,行号
awk 命令: 1. 打印行号和内容: awk '{print NR":"$0}' 2. 输出:偶数行和奇数行到文件 awk '{print $0.txt > NR%2.tx ...
- lua 的 table 处理
lua 的整体效率是很高的,其中,它的 table 实现的很巧妙为这个效率贡献很大. lua 的 table 充当了数组和映射表的双重功能,所以在实现时就考虑了这些,让 table 在做数组使用时尽量 ...
- uwsgi -- unavailable modifier requested: 0 -- 的解决办法
nginx 报错 upstream prematurely closed connection while reading response header from upstream 说明是上游服务器 ...