C++算法学习——预备知识(1)——泛型(通用)编程

————以下的内容参考自:
1.Generic programming,Wikipedia
2.design patters

什么是通用编程

泛型编程(Generic programming,又称为通用编程,我更喜欢这个称呼),是一种计算机编程的风格,其中根据要指定的类型编写算法,然后在需要时为特定类型提供参数进行实例化。 这种由方法ML在1973年开创。允许编写通用功能或类型,它们在使用时仅在其操作类型的集合上不同,从而减少重复。 这些软件实体被称为Ada,C#,Delphi,Eiffel,F#,Java,Objective-C,Rust,Swift和Visual Basic .NET中的泛型(generics )。 它们被称为ML,Scala,Haskell中的参数多态性(Haskell社区对于相关但有些不同的概念也使用术语“通用”)和Julia; C ++和D中的模板; 和参数化类型。这种技术是非常强大的,一个代码可以被多种类型使用,极大地减少了代码量和增强了代码的通用性。

通用编程一词最初是由David Musser和Alexander Stepanov 以更具体的意义来创造的,用于描述一种编程范式,其中对于类型的基本要求从算法和数据结构的具体示例中抽象出来并形式化为概念,具有根据这些概念实现的通用函数,通常使用如上所述的语言通用机制。
通用编程在Musser&Stepanov(1989)中定义如下:

Generic programming centers around the idea of abstracting from concrete, efficient algorithms to obtain generic algorithms that can be combined with different data representations to produce a wide variety of useful software.
— Musser, David R.; Stepanov, Alexander A., Generic Programming

翻译一下:
通用编程围绕着从具体的高效算法中抽象出来的想法,以获得可与不同数据表示相结合的通用算法,以产生各种有用的软件。
简单来说,我们可以使用这种技术把我们的算法装在里面,以便我们可以随时调用于各种各样的数据类型中。这就是为什么我们在讲数据结构与算法的时候我们要先提这个技术。

通用编程有什么用

通用编程范式是软件分解的一种方法,其中类型的基本要求从算法和数据结构的具体示例中抽象出来,并且形式化为概念,类似于抽象代数中代数理论的抽象。(类似于我们的数学公式,比如 x,y 符合关系,y = x + 2,当 x = 1 的时候,y就被实例化为3,当没有实例的时候,意味着这个公式是所有满足这个关系的数值的抽象)这种编程方法的早期实例在Scheme和Ada 中实现,其中最为人所知的例子是标准模板库(STL),,其开发了用于序列数据结构的迭代器理论以及运算的算法。

例如,给定N个序列数据结构,例如。单链表,vector等,以及M算法对它们进行操作。查找,排序等,直接方法将针对每个数据结构实现每个算法,从而实现N×M组合。然而,在通用编程方法中,每个数据结构返回一个迭代器概念的模型(一个简单的值类型,可以被取消引用以获取当前值,或者改变为指向序列中的另一个值),并且每个算法被替代地写入一般来说,这些迭代器的参数,例如指向要处理的子序列的开始和结束的一对迭代器。因此,只需要实现N + M个数据结构的算法组合。在STL中指定了几个迭代器概念,每个都有更多限制性概念的细化。前向迭代器仅向顺序中的下一个值提供移动(例如,适用于单链表或输入数据流),而随机访问迭代器还可提供对该序列的任何元素的直接定时访问(例如,适当的对于一个向量)。重要的一点是,数据结构将返回一个可以高效实现的最通用概念的模型,计算复杂性要求是概念定义的明确部分。这限制了可以应用给定算法的数据结构,并且这种复杂性要求是数据结构选择的主要决定因素。通用编程类似地已经应用于其他领域,例如图算法。

请注意,虽然这种方法通常使用编译时通用性/模板的语言特性,但实际上它独立于特定的语言技术细节。通用程式设计先锋Alexander Stepanov 写到:

Generic programming is about abstracting and classifying algorithms and data structures. It gets its inspiration from Knuth and not from type theory. Its goal is the incremental construction of systematic catalogs of useful, efficient and abstract algorithms and data structures. Such an undertaking is still a dream.
— Alexander Stepanov, Short History of STL

通用编程是关于抽象,分类算法和数据结构。它从Knuth中获得的灵感,而不是类型理论。 其目标是对有用,高效和抽象的算法和数据结构进行系统化目录的渐进式构建。虽然这样做还是一个梦想。

C++中的泛型(通用编程)

当以静态类型语言创建容器类时,为每个数据类型编写特定的实现是不方便的,特别是如果每个数据类型的代码几乎相同。 例如,在C ++中,可以通过定义一个类模板来规避这种重复的代码:

template<typename T>
class List
{
   /* class contents */
};

List<Animal> list_of_animals;
List<Car> list_of_cars;

ps :如果不了解这个功能,那么没关系,你现在只要知道这样做有什么意义就好了,我下一篇会就模板来详细介绍这里的奥妙。
以上,T是创建列表时指定的任何类型的占位符。 这些通常称为模板的“容器类型”,允许使用不同的数据类型重新使用类,只要保留某些合同(如子类型)。这种通用机制不应该与包含多态性(包括多态性)混淆,这是可交换子类的算法使用:例如,包含Animal和Car类型的对象的Moving_Object类型的对象列表。 模板也可以用于类型独立的功能,如下面的Swap示例所示:

template<typename T>
void Swap(T & a, T & b) //"&" passes parameters by reference
{
   T temp = b;
   b = a;
   a = temp;
}

string hello = "world!", world = "Hello, ";
Swap( world, hello );
cout << hello << world << endl; //Output is "Hello, World!"

上面使用的C ++模板构造被广泛引用为普遍性的程序员和语言设计者之间的概念,并支持许多通用编程习语。 D编程语言还提供基于C ++先例但具有简化语法的完全通用的模板。 Java编程语言自从引入J2SE 5.0以来,基于C ++语法提供了通用性设施。
注意:C++中有两种模板,函数模板和类模板。函数模板是用于根据实例化时提供的参数化类型创建普通函数的模式。

下一篇,我们提一下C++中的模板。这篇文章还是参考为主,因为这只是了解一下这个技术,我们以后这个系列还是基于这个技术实现各种数据结构与算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值