泛型编程与设计新思维

2016-01-29 12:23 3 1 收藏

泛型编程与设计新思维,泛型编程与设计新思维

【 tulaoshi.com - C语言心得技巧 】

泛型编程与设计新思维


作者:徐景周

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com) 前言
    永远记住,编写代码的宗旨在于简单明了,不要使用语言中的冷僻特性,耍小聪明,重要的是编写你理解的代码,理解你编写的代码,这样你可能会做的更好。 --- Herb Sutter
    1998年,国际C++标准正式通过,标准化对C++最重要的贡献是:对"强大的抽象概念"给于更有力的支持,以降低软件的复杂度,C++提供了二种功能强大的抽象方法:面向对象编程与泛型编程。面向对象编程大家一定很熟悉了,这里就不再哆嗦了。提到泛型编程(Generic Programming),有的人可能还不太熟悉,但是提到STL,你就一定会有所耳闻了。STL(Standard Template Library,标准模板库) 其实就是泛型编程的实现品,STL是由Alexander Stepanov(STL之父)、David R Musser和Meng Lee三位大师共同发展,于1994年被纳入C++标准程序库。STL虽然加入C++标准库的时间相对较晚,但它却是C++标准程序库中最具革命性的部分,同时也是C++标准程序库中最重要的组成部分。由于新的C++标准库中几乎每一样东西都是由模板(Template)构成的,当然,STL也不会例外。所以,在这里有必要先概要说明一下模板的有关概念。

模板概念
    通过使用模板可以使程序具有更好的代码重用性。记住,模板是对源代码进行重用,而不是通过继承和组合重用对象代码,当用户使用模板时,参数由编译器来替换。模板由类模板和函数模板二部分组成,以所处理的数据类型的说明作为参数的类就叫类模板,而以所处理的数据类型的说明作为参数的函数叫做函数模板。模板参数可以由类型参数或非类型参数组成,类型参数可用class和typename关键字来指明,二者的意义相同,都表示后面的参数名代表一个潜在的内置或用户定义的类型,非类型参数由一个普通参数声明构成。下面是类模板和函数模板的简单用法:
template<class T1, int Size>class Queue// 类模板,其中T1为类型参数,Size为非类型参数{ public: explicit Queue():size_(Size){};// 显式构造,避免隐式转换……template<class T2> void assign(T2 first,T2 last);   // 内嵌函数模板 private:T* temp_;int size_;}// 类模板中内嵌函数模板Compare的外围实现(如在Queue类外实现)template<class T1,int Size> template<class T2>void Queue<T1,Size>::assign (T2 first,T2 last) {};// 模板的使用方法int ia[4] = {0,1,2,3};Queue<int, sizeof(ia)/sizeof(int)> qi;qi.assign(ai,ai+4);
泛型编程
    泛型编程和面向对象编程不同,它并不要求你通过额外的间接层来调用函数,它让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。所谓泛型(Genericity),是指具有在多种数据类型上皆可操作的含意,与模板有些相似。STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。STL以迭代器(Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库,容器的存在使这些算法有东西可以操作。STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(function objects)。STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。
    迭代器(Iterators)是STL的核心,它们是泛型指针,是一种指向其他对象(objects)的对象,迭代器能够遍历由对象所形成的区间(range)。迭代器让我们得以将容器(containers)与作用其上的算法(algorithms)分离,大多数的算法自身并不直接操作于容器上,而是操作于迭代器所形成的区间中。迭代器一般分为五种:Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iterator就象只从输入区间中读取数据一样,具有只读性,属于单向移动,如STL中的istream_iterator。Output Iterator刚好相反,只写出数据到输出区间中,具有只写性,属于单向移动,如STL中的ostream_iterator。Forward Iterator也属于单向移动,但不同之处是它同时具有数据读、写性。Bidirections Iterator如名称暗示,支持双向移动,不但可以累加(++)取得下一个元素,而且可以递减(--)取前一个元素,支持读、写性

来源:https://www.tulaoshi.com/n/20160129/1485895.html

延伸阅读
在2005年底微软公司正式发布了C# 2.0,与C# 1.x相比,新版本增加了很多新特性,其中最重要的是对泛型的支持。通过泛型,我们可以定义类型安全的数据结构,而无需使用实际的数据类型。这能显著提高性能并得到更高质量的代码。泛型并不是什么新鲜的东西,他在功能上类似于C++的模板,模板多年前就已存在C++上了,并且在C++上有大量成熟应用。...
什么是泛型 一种类型占位符,或称之为类型参数。我们知道在一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显好处是类型安全和减少装箱、拆箱。 类型安全和装箱、拆箱 作为一种类型参数,泛型很...
有意识地培养孩子的创新思维 幼儿期是创新思维形成的黄金时期,幼儿具有创新能力的萌芽,他们的创新能力具有不自觉性、不稳定性和可塑性强等特点。利用他们的可塑性进行早期教育,使其创新能力趋向自觉、稳定,使处于萌芽状态的创新能力得到发展是家庭教育的一个重要任务。 ●保护孩子的好奇心 孩子提出问题、解决问题的过程,也就是积极思...
有意识地培养孩子的创新思维 幼儿期是创新思维形成的黄金时期,幼儿具有创新能力的萌芽,他们的创新能力具有不自觉性、不稳定性和可塑性强等特点。利用他们的可塑性进行早期教育,使其创新能力趋向自觉、稳定,使处于萌芽状态的创新能力得到发展是家庭教育的一个重要任务。 ●保护孩子的好奇心 孩子提出问题、解决问题的过程,也就是积极思...
觉得作者写得太好了,不得不收藏一下。 对这个例子的理解: //类型参数不能用基本类型,T和U其实是同一类型。 //每次放新数据都成为新的top,把原来的top往下压一级,通过指针建立链接。 //末端哨兵既是默认构造器创建出的符合end()返回true的节点。 代码如下: //: generics/LinkedStack.java // A stack implemented with an internal l...

经验教程

89

收藏

88
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部