目录

​一,范畴篇​

​二,类型type、概念concept​

​三,类型函数及类型属性函数​

​1,类型函数​

​2,类型属性函数​

​四,正则、半正则​

​1,正则Regular​

​(1)操作集​

​(2)语义集​

​(3)复杂度​

​2,半正则Semiregular​

​五,迭代器​

​1,操作集​

​2,迭代器必须是正则的​

​3,迭代器的分类​

​六,区间​


一,范畴篇

亚里士多德有一部重要作品叫做​​《工具论》​​,第一篇文章叫做《范畴篇》。

亚氏在这篇文章中介绍了抽象这一概念。他论述了个体(individual)、物种(species)与属(genus)之间的区别。物种能够概括某一类事物的“本质”特征,而属则包含很多物种。

亚里士多德所说的属给泛型编程提供了灵感,这种编程方式把注意力放在属的层面上,而不是种的层面上。

二,类型type、概念concept

类型对应种、概念对应属。

数学与泛型编程(6)编程的基本概念_编程

concept可以视为对类型所提出的一系列要求,或是一个用来判断类型是否满足这些要求的谓词。

对类型所提出的要求,涉及下列三个方面:(简称操作集、语义集、复杂度


  • 类型必须提供哪些操作;
  • 这些操作的语义;
  • 这些操作的时间/空间复杂度。

为什么要把时间/空间复杂度也算作一项要求呢?

比如栈这种类型,在O(1)时间内进行push和pop就是必须满足的要求,无论是用数组还是链表还是向量来实现栈,都要满足这个要求,不满足的话就不能算栈。

三,类型函数及类型属性函数

1,类型函数

类型函数是一种能够根据给定的类型来返回其附属类型的函数。

比如coefficient_type(Polynomial)

2,类型属性函数

类型属性函数是一种能够根据给定的类型来返回一个值,用以表示该类型的某项属性的函数。

比如C++的sizeof关键字、python的type函数

四,正则、半正则

有两种常见的类型属性,一个是正则Regular,一个是半正则Semiregular

1,正则Regular

(1)操作集


  • 拷贝构造
  • 赋值
  • 判断是否相等(等价测试)
  • 析构

(2)语义集

数学与泛型编程(6)编程的基本概念_复杂度_02

第一条公理的意思是:如果用b构造出了a,那么凡是与b相等的事物,现在也都会与a相等。

第二条公理的意思是:如果把b赋给了a,那么凡是与b相等的事物,现在也都会与a相等。

第三条公理用到了正则函数,这种函数能够根据相等的输入值而产生相等的输出值。

(3)复杂度

Regular对复杂度所提出的要求是:每项操作的复杂度都不能比该对象所在区域内的线性操作更高。

这个区域是指对象所占据的全部空间,它既包括头部,又包括远程部分,既包括数据,又包括连接器。

2,半正则Semiregular

半正则与正则类似,只是没有明确定义等价测试操作而已。

在很难实现等价谓词的场合,就需要用到这个concept。然而即便在这种情况下,我们还是会认为,值之间是有相等关系的,只不过没有明确定义出来而已

这种预设使得与拷贝及赋值有关的那些公理(即正则的三条公理)依然能够成立。

五,迭代器

迭代器也是一种类型属性。迭代器可以理解为一种能够在线性时间内执行线性搜索的东西,可以视为广义的指针。

1,操作集


  • 常规类型所应支持的操作
  • 移动到后继位置的操作
  • 解引用操作

2,迭代器必须是正则的

因为我们有时想知道,某个迭代器有没有赶上另外一个迭代器。

3,迭代器的分类

输入迭代器:支持单向遍历,只能遍历一轮(如输入流的迭代器)

前向迭代器:支持单向遍历,可以遍历多轮(如链表的~)

双向迭代器:支持双向遍历,可以遍历多轮

随机访问迭代器:可以用在需要进行随机访问的算法中

输出迭代器:可以交替执行移动到后继位置(++)与解引用(*)这两种操作

链式迭代器:可以用在后继函数可变的场合中

分段迭代器:可以用在数据存储于多个不连续区段的场合中

六,区间

数学里面有4种区间:开区间、闭区间、左开右闭区间、左闭右开区间

编程中只用到两种:闭区间、左闭右开区间

区间有两种表示方式:一种叫做双界区间,另一种叫做计数区间

数学与泛型编程(6)编程的基本概念_编程_03