目录
一,范畴篇
1,类型函数
(1)操作集
(2)语义集
(3)复杂度
五,迭代器
1,操作集
六,区间
一,范畴篇
亚里士多德有一部重要作品叫做《工具论》,第一篇文章叫做《范畴篇》。
亚氏在这篇文章中介绍了抽象这一概念。他论述了个体(individual)、物种(species)与属(genus)之间的区别。物种能够概括某一类事物的“本质”特征,而属则包含很多物种。
亚里士多德所说的属给泛型编程提供了灵感,这种编程方式把注意力放在属的层面上,而不是种的层面上。
二,类型type、概念concept
类型对应种、概念对应属。
concept可以视为对类型所提出的一系列要求,或是一个用来判断类型是否满足这些要求的谓词。
对类型所提出的要求,涉及下列三个方面:(简称操作集、语义集、复杂度)
- 类型必须提供哪些操作;
- 这些操作的语义;
- 这些操作的时间/空间复杂度。
为什么要把时间/空间复杂度也算作一项要求呢?
比如栈这种类型,在O(1)时间内进行push和pop就是必须满足的要求,无论是用数组还是链表还是向量来实现栈,都要满足这个要求,不满足的话就不能算栈。
三,类型函数及类型属性函数
1,类型函数
类型函数是一种能够根据给定的类型来返回其附属类型的函数。
比如coefficient_type(Polynomial)
2,类型属性函数
类型属性函数是一种能够根据给定的类型来返回一个值,用以表示该类型的某项属性的函数。
比如C++的sizeof关键字、python的type函数
四,正则、半正则
有两种常见的类型属性,一个是正则Regular,一个是半正则Semiregular
1,正则Regular
(1)操作集
- 拷贝构造
- 赋值
- 判断是否相等(等价测试)
- 析构
(2)语义集
第一条公理的意思是:如果用b构造出了a,那么凡是与b相等的事物,现在也都会与a相等。
第二条公理的意思是:如果把b赋给了a,那么凡是与b相等的事物,现在也都会与a相等。
第三条公理用到了正则函数,这种函数能够根据相等的输入值而产生相等的输出值。
(3)复杂度
Regular对复杂度所提出的要求是:每项操作的复杂度都不能比该对象所在区域内的线性操作更高。
这个区域是指对象所占据的全部空间,它既包括头部,又包括远程部分,既包括数据,又包括连接器。
2,半正则Semiregular
半正则与正则类似,只是没有明确定义等价测试操作而已。
在很难实现等价谓词的场合,就需要用到这个concept。然而即便在这种情况下,我们还是会认为,值之间是有相等关系的,只不过没有明确定义出来而已。
这种预设使得与拷贝及赋值有关的那些公理(即正则的三条公理)依然能够成立。
五,迭代器
迭代器也是一种类型属性。迭代器可以理解为一种能够在线性时间内执行线性搜索的东西,可以视为广义的指针。
1,操作集
- 常规类型所应支持的操作
- 移动到后继位置的操作
- 解引用操作
2,迭代器必须是正则的
因为我们有时想知道,某个迭代器有没有赶上另外一个迭代器。
3,迭代器的分类
输入迭代器:支持单向遍历,只能遍历一轮(如输入流的迭代器)
前向迭代器:支持单向遍历,可以遍历多轮(如链表的~)
双向迭代器:支持双向遍历,可以遍历多轮
随机访问迭代器:可以用在需要进行随机访问的算法中
输出迭代器:可以交替执行移动到后继位置(++)与解引用(*)这两种操作
链式迭代器:可以用在后继函数可变的场合中
分段迭代器:可以用在数据存储于多个不连续区段的场合中
六,区间
数学里面有4种区间:开区间、闭区间、左开右闭区间、左闭右开区间
编程中只用到两种:闭区间、左闭右开区间
区间有两种表示方式:一种叫做双界区间,另一种叫做计数区间