泛型编程

1.C++两种抽象方法

(1)面向对象编程

  • 封装(Encapsulation)
  • 继承(Inheritance)
  • 多态(Polymorphism)

(2)泛型编程

  • 概念(concepts)
  • 模型化(modeling)
  • 强化(refinement)

2.泛型编程概念

    泛型编程(Generic Programming) 指在多种数据类型上皆可操作。和面向对象编程不同,它并不要求额外的间接层来调用函数,而是使用完全一般化并可重复使用的算算效率与针对某特定数据类型而设计的算法相同。

(1)概念(concepts)

    类型必须满足的一组条件。基本的concepts中有赋值、默认构造、相等比较、小于判断等。

(2)模型(modeling)

    当类型满足这个条件,即为该concepts的一个model。

    如果能够复制类型X的值,或者赋给X对象一个新值的话,则类型X是Assignable的一个model。

(3)强化(refinement)

   如果concept  C2满足concept  C1的所有条件,再加上其他额外条件,则C2是C1的强化(refinement)。

     泛型编程

3.泛型编程实现

(1)模板

  • 函数模板
  • 类模板

(2)STL

    STL(Standard Template Library,标准模板库) 是泛型编程思想的实现,于1994年被纳入C++标准程序库。STL是一种高效、泛型、可交互操作的软件组件,巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。

    STL以迭代器(Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库,容器的存在使这些算法有东西可以操作。STL包含泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)、函数对象(function objects)。

    迭代器(Iterators)是STL的核心,它们是泛型指针,是一种指向其他对象(objects)的对象,迭代器能够遍历由对象所形成的区间(range)。

   迭代器一般分为五种:

  • Input Iterator     只读,单向移动,如STL中的istream_iterator。
  • Output Iterator   只写,单向移动,如STL中的ostream_iterator。
  • Forward Iterator   具有读、写性,单向移动。
  • Bidirections Iterator   ​​​​​​​具有读、写性,双向移动。
  • ​​​​​​​Random Access Iterator   具有读、写性,随机访问

       泛型编程

 

4.泛型编程优缺点

1)通用性强

            泛型算法是建立在语法一致性上,运用到的类型集是无限的/非绑定的。

2)效率

            编译期能确定静态类型信息,其效率与针对某特定数据类型而设计的算法相同。

3)类型检查严

            静态类型信息被完整的保存在了编译期,编译期发觉更多潜在的错误。

4)二进制复用性

           泛型算法是建立在语法一致性上,语法是代码层面的,语法上的约定无法体现在二进制层面。泛型算法实现的库,其源代码基本上是必须公开的。而传统的C库全是以二进制形式发布的。