侯捷 GP与STL

合集下载

STL源码 侯捷注释

STL源码 侯捷注释

STL源码侯捷注释《STL源码侯捷注释》是一本经典的程序员必备书籍,它为广大程序员提供了深入了解STL源码的机会。

本文将从以下几个方面进行分析和评价。

一、作者介绍侯捷是一位著名的程序员和作家,他曾获得多项国际和国内大奖,包括ACM国际程序设计竞赛金牌、IBM杰出软件奖、国家自然科学二等奖等。

他还是多本计算机书籍的作者,如《STL源码剖析》、《C++程序设计》等。

二、书籍概述《STL源码侯捷注释》是一本详细介绍STL源码的书籍,它对STL的各个组成部分进行了详细的解析和注释。

本书的主要特点包括:1.详细的注释:本书对STL源码的每个细节都进行了详细的解释和注释,使读者能够深入了解STL的实现原理。

2.清晰的结构:本书按照STL源码的结构进行组织,并提供了详细的目录和索引,方便读者查找和理解。

3.丰富的例子:本书提供了大量的例子,帮助读者更好地理解STL的使用方法和实现原理。

4.全面的覆盖:本书覆盖了STL的所有组成部分,包括容器、迭代器、算法、仿函数等。

三、书籍优点1.深入浅出:本书的注释和解释非常详细,但又不失深入浅出的风格,使读者能够轻松理解STL的实现原理。

2.丰富的例子:本书提供了大量的例子,使读者能够更好地理解STL的使用方法和实现原理。

3.清晰的结构:本书按照STL源码的结构进行组织,并提供了详细的目录和索引,方便读者查找和理解。

4.全面的覆盖:本书覆盖了STL的所有组成部分,包括容器、迭代器、算法、仿函数等。

四、书籍不足之处1.过于复杂:本书注释和解释的内容非常详细,但有时候可能会让读者感到过于复杂和深入,不太适合初学者。

2.缺少实战案例:本书提供了大量的例子,但是缺少实战案例,读者可能需要自己去实践。

五、适合读者群体《STL源码侯捷注释》适合以下读者群体:1.对STL源码有兴趣的程序员。

2.希望深入了解STL实现原理的程序员。

3.希望提高自己的STL编程能力的程序员。

4.想要更好地掌握C++语言和STL的程序员。

侯捷老师——STL源码剖析

侯捷老师——STL源码剖析

侯捷老师——STL源码剖析侯捷老师是国内知名的C++专家,他在C++领域有着很高的知名度和影响力。

他的《STL源码剖析》是一本非常经典的C++书籍,深入剖析了C++标准模板库(Standard Template Library,STL)的源代码,并详细解释了其设计思想和实现细节。

下面是对这本书的1200字以上的介绍。

《STL源码剖析》是一本写给C++程序员的经典著作,它由侯捷老师亲自编写,内容非常详尽和深入。

这本书主要介绍了C++标准模板库(STL)的源代码,并解析了其中的设计思想和实现细节。

通过阅读这本书,读者可以更好地理解STL的底层原理,提高自己的C++编程能力。

这本书共分为13个章节,每个章节都涉及了STL的不同组件和特性。

书中的内容既包括理论知识,也包括具体的代码实现。

侯捷老师用通俗易懂的语言和形象生动的例子,对STL的各个组件进行了详细介绍。

他从容器、迭代器、算法和函数对象等方面入手,逐步展开对STL的剖析。

每一章的结尾都有相关的练习题,读者可以通过做题来巩固所学知识。

在《STL源码剖析》中,侯捷老师对STL的源代码进行了深入分析,解释了其中的设计思想和实现原理。

他通过对容器的底层结构和操作进行剖析,揭示了STL的高效性和灵活性。

在对算法和函数对象的讲解中,他详细介绍了STL中的各种常用算法,并解释了它们的内部实现原理。

通过这种深入的分析,读者可以更好地理解STL的运作机制,并能够灵活运用STL进行程序设计。

除了对STL源代码的剖析,侯捷老师还对STL的使用和扩展进行了说明。

他介绍了STL的使用注意事项和常见问题,并给出了一些实用的编程技巧和优化建议。

此外,他还展示了如何扩展STL,给出了一些自定义容器和算法的示例。

这些内容对于想要深入学习和应用STL的读者来说是非常有价值的。

总的来说,侯捷老师的《STL源码剖析》是一本非常权威和深入的C++书籍,对于想要深入学习STL的C++程序员来说是一本必读之作。

侯捷讲设计模式

侯捷讲设计模式

這裡雖是以 template param. 方式傳入㆒個底層容器(也就是 adaptee),但也可以 以 aggregation 方式來設計,像是寫為 Sequence* c; 而 Sequence 是 deque 和 list 的 base class。
jjhou@ 13
jjhou@ 14
2. Adapter in STL. Functor adaptable
// STL規定,每㆒個 Adaptable Unary Function 都應該繼承此類別 // STL規定,每㆒個 Adaptable Unary Function 都應該繼承此類別 template <class Arg, class Result> template <class Arg, class Result> struct unary_function { struct unary_function { typedef Arg argument_type; typedef Arg argument_type; typedef Result result_type; typedef Result result_type; }; }; // STL規定,每㆒個 Adaptable Binary Function 都應該繼承此類別 // STL規定,每㆒個 Adaptable Binary Function 都應該繼承此類別 template <class Arg1, class Arg2, class Result> template <class Arg1, class Arg2, class Result> struct binary_function { struct binary_function { typedef Arg1 first_argument_type; typedef Arg1 first_argument_type; typedef Arg2 second_argument_type; typedef Arg2 second_argument_type; typedef Result result_type; typedef Result result_type; }; };

面向对象的理论与C++实践清华课程设计

面向对象的理论与C++实践清华课程设计

面向对象的理论与C++实践清华课程设计一、课程介绍面向对象的理论与C++实践是清华大学计算机科学与技术系本科生专业选修课程,涵盖面向对象编程理论和C++编程实践两个方面,旨在帮助学生深入理解面向对象思想并用C++语言进行实现。

二、课程内容面向对象编程理论1.面向对象思想概述2.类与对象3.继承、多态与虚函数4.抽象类与纯虚函数5.STL库简介C++编程实践1.C++程序设计基础2.类与对象的实现3.继承、多态与虚函数的实现4.STL库的使用三、课程教材《C++ Primer》(第五版)(中文版),作者:Lippman, Lajoie, Moo,译者:侯捷。

四、课程参考资料1.《Effective C++》(中文版),作者:Scott Meyers,译者:侯杰。

2.《STL源码剖析》(中文版),作者:侯捷。

3.《深入浅出设计模式》(中文版),作者:程杰。

五、课程设计要求1.选题要求:要求选好一个项目,体现应用面向对象编程的思想。

2.设计方案包括:给出所设计类的类体及成员函数原型,试画出相应的类图,写出内部数据结构方案的描述,描述各类或各函数功能作用的注释。

3.程序要求:为了反映面向对象编程语言的特征,要使用C++语言进行编程,采用面向对象思想,必须使用类和对象来体现程序设计思想,要充分利用C++语言的特性和STL库进行程序开发。

六、课程设计流程第一阶段:选题第一次课程上老师将介绍课程设计大概内容,学生需要结合个人实际情况,选定一个初步的设计主题,初步选题可与老师讨论资讯。

相当于开题选题环节。

第二阶段:设计方案在确定题目后,需要自己独立完成课程设计方案。

设计方案要求如上述第五部分所说明。

相当于中期论文。

第三阶段:实现程序在建立好方案后,开始进行程序实现。

实现过程中出现问题,需及时向老师或助教请教解决,最终提交实现代码。

相当于结题报告。

七、课程评分标准1.选题:选题是否合理,是否具有一定难度性;2.设计方案:方案是否完善,方案中的类设计是否具有标准性;3.程序代码:代码是否规范,是否达到良好的代码质量,代码是否具有可扩充性、可移植性等软件工程方面的优良特征;4.报告:书面报告是否符合规范,语言表达、图表使用是否得当;5.程序演示:演示时是否条理清晰,是否表现出更高的带了解问题以及解决问题的能力。

stl的使用介绍的书籍

stl的使用介绍的书籍

stl的使用介绍的书籍STL(Standard Template Library,标准模板库)是C++编程语言的一个重要组成部分,它为C++程序员提供了一套丰富的数据结构和算法,极大地提升了开发效率和代码的可重用性。

本文将介绍几本关于STL使用的优秀书籍,帮助读者更好地掌握STL的应用。

1.《Effective STL》《Effective STL》是Scott Meyers写的一本经典著作,旨在向读者展示如何高效地使用STL。

书中通过丰富的示例和详细的讲解,介绍了STL中各个容器、算法和迭代器的使用方法和注意事项。

同时,书中还提供了许多实用的技巧和技巧,帮助读者写出高质量的STL代码。

2.《STL源码剖析》《STL源码剖析》是侯捷教授编著的一本经典教材,深入剖析了STL 的实现原理和内部机制。

这本书不仅讲解了STL中各个容器和算法的实现细节,还介绍了STL的设计思想和优化技巧。

通过阅读本书,读者可以更好地理解STL的底层实现,提升自己的编程能力。

3.《C++标准库》《C++标准库》是Nicolai M. Josuttis撰写的一本权威性书籍,全面介绍了C++标准库,包括STL在内的各个组件。

书中详细讲解了STL中容器、算法、迭代器、函数对象等的使用方法,并给出了大量的示例代码。

此外,书中还介绍了C++11、C++14和C++17中新添加的特性,使读者了解最新的C++标准库开发技术。

4.《STL教程与案例精解》《STL教程与案例精解》是郝斌编著的一本教材,通过大量的案例和实例,系统地讲解了STL的使用方法和应用技巧。

书中从容器、迭代器、算法等方面入手,深入浅出地介绍了STL的各个组成部分,并提供了丰富的练习题和案例分析,帮助读者巩固所学知识。

5.《STL源码剖析与应用》《STL源码剖析与应用》是李师贺编著的一本专门讲解STL源码和应用的书籍。

书中详细解析了STL的设计思想、实现原理和内部机制,帮助读者深入理解STL的底层实现。

PowerSHAPE基础教程

PowerSHAPE基础教程
............................................................................................................................................................................. I
用户坐标系 .................................................................................................................................................................... 33 方框范例 .................................................................................................................................................................... 33 提示:- ................................................................................................................................................................ 39 模具零件用户坐标系对齐定位................................................................................................................................. 41 用户坐标系工具栏 .................................................................................................................................................... 43

撼世出击:C与C++编程语言学习资料尽收眼底 电子书+视频教程

撼世出击:C与C++编程语言学习资料尽收眼底 电子书+视频教程

初稿,待完善Visual C++(VC/MFC)学习电子书及开发工具下载请看这里史无前例的网络最全最强C/C++资料索引:∙C/C++编程语言学习资料尽收眼底电子书+视频教程∙VC++/MFC(VC6)开发技术精品学习资料下载汇总∙Visual C++/MFC数字图像处理学习参考资料下载大全∙C++ Builder开发技术相关精品资料下载汇总∙C/C++开发工具/集成开发环境下载汇总∙VC/MFC开发必备Visual C++、Visual Studio、MSDN等下载汇总C++编程语言学习百宝箱(C++ Programming Language):C++ How to Program, 7/e (C++大学教程第7版) 英文原版全彩页C++大学教程第五版(C++ How to Program, 5/e)C++程序设计语言(特别版) 中文版C++程序设计原理与实践(中文高清版) | Programming: Principles and Practice Using C++ (英文原版)The C++ Programming Language, 3rd EditionC++ Primer 第四版中文版C++ Primer 第四版中英文对照文字版C++ Primer 第三版中文版C++ Cookbook 中文版高清PDF下载| O'Reilly C++ CookbookC++Primer Plus(第五版)中文版+习题解答+代码| 英文原版C++程序设计教程第二版钱能易学C++ (Easy C++) 中文PDF文字版附习题答案及书中源码现代C++程序设计C++ 参考大全(第四版)C++大学教程中文chmEffective C++ 中文版Essential C++ 中文版+英文版侯捷译Exceptional C++ Style 中文版C++编程思想(第2版)第1卷:标准C++导引C++编程思想(第2版)第2卷:实用编程技术C++编程思想第1卷标准C++导引C++编程思想第2卷实用编程技术C++编程思想第2卷实用编程技术(中文版)C++入门经典(第三版)中文PDF版+详细书签Google C++编程风格指南C++编程艺术C++编程金典(第3版) 清华大学出版C++编程规范:101条规则、准则与最佳实践C++编程惯用法高级程序员常用方法和技巧疑惑C++实用C++编程大全C++程序设计与导论(第二版)C和C++代码精粹C++沉思录C++必知必会C++程序调试实用手册C++面向对象多线程编程高质量C++编程指南深度探索c++对象模型侯捷译设计模式:可复用面向对象软件的基础中文高清PDF版C++精髓软件工程方法C++技术参考手册C++游戏编程C++高级编程C++编程:数据结构与程序设计方法数据结构C++语言描述应用标准摸板库STL(第2版)现代程序设计——C++与数据结构面向对象的方法与实现C++高级参考手册大规模C++程序设计C++语言的设计和演化C++标准程序库(前6章)C++ Templates全览中文版C++模板元编程中文PDF下载(C++ Template Metaprogramming)标准C++库函数参考The Annotated C++ Reference ManualC++多范型设计COM实例编程C++ STL程序员开发指南PDF下载C++ STL开发技术导引STL源码剖析泛型编程与STLEffective STL 中文版C++ STL程序员开发指南C++模板技术大全C++语言的设计和演化中文PDF版数据结构各种算法实现(C++模板)数据结构、算法与应用:C++语言描述Absolute C++, 4th EditionSams C++ UnleashedEffective C++, 3rd EdtitionO'Reilly C++ In a Nutshell Exceptional C++ StyleMore Exceptional C++C++ Coding StandardsInside the C++ Object ModelMore Exceptional C++Exceptional C++Cross-Platform Development in C++Practical C++ ProgrammingC++ GUI Programming with Qt 4C++ Coding Standards 101 Rules GuidelinesC++ Template MetaprogrammingC++ Standard Library - A Tutorial and ReferenceProfessional Multicore ProgrammingAccelerated C++ - Practical Programming by Example2005年度最经典C++教程8本打包下载C编程语言学习百宝箱(C Programming Language):C语言上机南开100题(2006年终结修订word版+ txt分类版)C语言程序设计:现代方法(第2版)中文版C语言程序设计:现代方法中文版C程序设计语言(第2版·新版) 文字版+书签| C程序设计语言(第2版·新版) 习题解答C程序设计(第三版) 谭浩强著谭浩强C语言程序设计教程全书Word版C大学教程(第五版)中文版PDF下载C Primer Plus(第五版)中文版北京大学C语言程序设计学习大全Word版全1045页C语言程序设计教程——基于Visual C++6.0环境你必须知道的495个C语言问题(C Programming FAQs)C语言实例解析精粹C专家编程C和指针C陷阱与缺陷ANSI C语言规范C语言编程第三版计算机图形学C语言版经典C程序100例GCC 权威指南第二版O'Reilly C Pocket ReferenceThe C Programming LanguageThe C Programming Language Special EditionThe Standard C Library (Djvu格式)Practical C ProgrammingC Primer PlusC Pocket ReferenceC Traps and PitfallsPhysics for Games ProgrammersC/C++名师视频大汇总:C语言程序设计视频教程吉林大学康辉48讲石油大学C语言程序设计视频教程曾怡主讲全33讲吉林大学C语言视频教程全51集CSF格式C语言基础视频教程全14讲完整上架C语言程序设计视频教程曾怡教授讲解全28讲完整版下载C++语言视频教程全51讲C++程序设计视频教程东南大学何洁月主讲全80讲(下) 32讲C++程序设计视频教程东南大学何洁月主讲全80讲(上) 48讲中山大学黎培兴C++语言视频教程全51讲完整版精品推荐数据结构C语言版视频教程全52讲完整版孙鑫C++视频教程rmvb格式全20CD完整版精品分享C++视频教程边用边学Visual C++ 6 (ASF格式)VC++面向对象与可视化程序设计视频教程编程经典C++ Builder视频教程全26讲avi格式下载另外,网络最强CASE工具+ 经典UML学习电子资下载汇总,软件设计与开发人员必备开源拓荒者整理的:C/C++书籍、网页、文档、资料。

侯捷的c++课程内容

侯捷的c++课程内容

侯捷老师的C++课程内容非常丰富,涵盖了C++的基础知识、面向对象编程、STL标准库和泛型编程、设计模式、新标准C++11&14、内存管理机制等多个方面。

具体来说,侯捷老师的C++课程包括:
1.C++编程简介:介绍C++的基本语法和编程思想,包括变量、数据类型、运算符、
控制结构等。

2.面向对象编程:介绍面向对象的基本概念和C++中的类、对象、继承、多态等
概念,以及如何使用面向对象的方法进行程序设计。

3.STL标准库和泛型编程:介绍STL标准库中的容器、算法、迭代器等,以及泛
型编程的概念和实现方法。

4.设计模式:介绍常见的面向对象设计模式,如单例模式、工厂模式、观察者模
式等,以及如何使用设计模式来提高代码的可维护性和可重用性。

5.新标准C++11&14:介绍C++11和C++14的新特性,如智能指针、lambda
表达式、范围for循环等,以及如何使用这些新特性来提高代码的效率和可读性。

6.内存管理机制:介绍C++中的内存管理机制,包括动态内存分配、内存泄漏检
测、垃圾回收等,以及如何避免内存泄漏和优化内存使用。

此外,侯捷老师的C++课程还包括一些进阶内容,如多线程编程、网络编程等,以及一些实用的编程技巧和经验分享。

总的来说,侯捷老师的C++课程内容非常全面,从基础到进阶,从理论到实践,涵盖了C++编程的各个方面。

通过学习侯捷老师的C++课程,可以深入了解C++编程语言的特点和应用,提高编程能力和水平。

STL之父访谈录

STL之父访谈录

STL之父访谈录
孟岩
【期刊名称】《程序员》
【年(卷),期】2001(000)002
【摘要】Dr.Dobb’s Journal特约记者,著名技术书籍作家Al Stevens采访
了STL创始人Alexander Stepanov。

这份访谈记录是迄今为止对于STL发展历
史的最完备介绍。

侯捷先生在他的STL有关文章里推荐大家阅读这篇文章。

【总页数】7页(P38-44)
【作者】孟岩
【作者单位】无
【正文语种】中文
【中图分类】TP311
【相关文献】
1.盐藻素,天生非等闲——中国“盐藻素之父”徐贵义教授访谈录 [J], 王林强;凌学江;
2.我的目标永远是让人开怀Perl之父LarryWall访谈录 [J], 卢鸫翔;王江平;
3.C++之父Bjarne Stroustrup访谈录 [J], 高博;吴天明;周梦伊;
4.PHP之父访谈录(上) [J], 邱海峰(译)
5.过去和未来、网络和现实的交接点——赛博朋克运动之父威廉·吉布森访谈录 [J], 鞠海彦
因版权原因,仅展示原文概要,查看原文内容请购买。

红黑树的插入与删除 详细整理资料

红黑树的插入与删除 详细整理资料

红黑树的插入、删除及旋转原则Category: Uncategorized— wuxicn @ 12:29 AM红黑树(Red-Black Tree)的插入和删除操作很繁琐,一不小心就容易弄错,不能靠强制记忆。

因此,今天总结一下红黑树插入和删除操作的推导原则,包括旋转的推导原则。

本文所有内容来自三个网页1./c?m=9d78d513d9d446db4fece4690a62c067691f97634d8b8d5068d4e20ace3f07070671e3ca617f0704a299213156b8492dacad21724 65377a09bb9db1b9bfcc17671c33034014ad11f45954ef9df01659f2fca1cafed0 ee6c9ed2fccfd8f8b840b009759127af7a0d50755448d2ee71446b2fbc6554b024 5fbf03161fb5b7122952957b630a3a66d30&p=8f36da5986cc46aa19be9b7a7f0a &user=baidu2.http://icoder.me/2009/08/25/insert-delete-in-red-black-tree/3./20065562/blog/item/93b2d17fd6f391320dd7da44.html如果大家能打开上面的链接,就不用再看了,我整理得不好。

先是比较简单的插入操作的推导原则:1. 红黑树的插入和普通搜索二叉树(Binary Search Tree)的插入一样,只是在插入完以后,将新插入的节点标记为红色,然后从该节点开始,向上进行调整颜色。

2. 向上调整颜色进行旋转时,旋转的原则是尽量用1次或者最多2次旋转完成,并且旋转操作不能影响该层以下层次的节点,只能影响其父节点,然后将其父节点(或者叔节点、兄弟节点)作为新的要调整颜色节点,继续向上递推调整。

Effective_STL

Effective_STL

Effective STL不需要看Amazon上的读者打分,也不需要去Array找C++专家们的书评。

单是似曾相识的封面,似曾相识的书名,还有似曾相识的作者,就足以证明它不会让你失望了。

这是Scott Meyers的第三本C++专著,在以其特有的简练而敏锐的笔锋揭示了如何有效使用C++语言本身的种种规则之后,Scott将注意力转移到了C++标准库中的STL部分。

Effective STL的各章节不同程度的涉及STL的六大构成要件。

千万不要误以为这是一本STL使用手册或者初学者指南,与这一系列的前两本一脉相承,Effective STL同样是为具备一定STL使用经验的程序员准备的。

提供了类型安全、高效而易用特性的STL无疑是最值得C++程序员骄傲的部分。

使用STL可以使你的代码更为优雅且易于维护,可以让你彻底的从C语言风格中解脱出来。

然而,STL秉承了C++的设计风格:高效甚至正确性仍然依赖于程序员的正确抉择。

如何正确使用STL(尤其是当性能问题至关重要的时候),对广大C++程序员来说仍是一种挑战。

也许你的C++代码已经充斥着vector、string甚至multimap,也许你正在为此而自鸣得意,然而,你是否真的了解STL呢?你知道如何在各种容器类之间做出正确的选择吗?你知道如何最为有效的从一个vector中删除特定值的元素吗?你知道关联容器中“等值”与“等价”的区别吗?先别急着回答,Scott 会让你后悔的,我保证。

有些书是每个C++程序员都必须拥有的,Effective STL正是其中的一本。

—— Thomas Becker, C/C++ Users Journal专栏作家以下文章(有效使用STL迭代器的三条基本原则)是C/C++ Users Journal摘录的Effective STL的三个独立条款。

你可以在找到英文原文。

关于Scott的前两本C++专著:Effective C++和More EffectiveC++,可以参见侯捷先生的书评:掷地铿锵的三本OOP小书。

侯捷-C++ 内存管理与优化高级培训

侯捷-C++ 内存管理与优化高级培训

培训纲要
第 1 阶段:CRT (C Runtime) malloc 深度剖析 讓學員充份了解 Microsoft C++ 對 malloc 的作法(非常複雜精巧) ; 除學習其中技術, 也足以評估自行加上各種 allocators 是必要還是多 餘。 第 2 阶段:C++内存管理相关操作深入剖析,应用开发技巧、实践与模式 new expression vs. operator new delete expression vs. operator delete array new and array delete placement new about overhead examples for operator new/delete overloading 第 3 阶段: STL 程序库内存管理设施深入剖析,应用开发技巧、实践与模式 std::auto_ptr boost::shared_ptr How to inherit operator new/delete Introduction to std::allocator
第 3 页 共 3 页
培训简介
Memory management 一向是 C++ programmer 的痛点,主要因为 C++ 不提供 Garbage Collection。这是效能顾虑下的一种取舍。现实如此,我们必须追求在如此的现 实下如何又快又好地运用 memory,使符合速度和空间的最大利益。本课程在低阶上全 面介绍 C++ 提供的各种 memory 管理工具(各种 overloadable operators) ,在高阶上 深刻学习各大链接库(包括 STL, Loki, MFC, Boost)的 Pooled Allocation 的作法,并 提供它们的高度可移植版(侯捷改编) ,同时提供各种效率优化技巧实践、与模式。

基于二叉树模型的绿色可交债分析——以G_三峡EB1_为例

基于二叉树模型的绿色可交债分析——以G_三峡EB1_为例

2023年11月中国林业经济November.2023第6期(总第183期)CHINA FORESTRY ECONOMICS No.6(Total 183)•财会金融•基于二叉树模型的绿色可交债分析 以G 三峡EB1为例仇㊀杰,张皓颖,李佳秀,贾昕然,丁㊀胜(南京林业大学经济管理学院,南京210037)收稿日期:2023-09-10基金项目:2023年南京林业大学大学生创新实践项目(2023NFUSPITP0139)第一作者简介:仇杰(2003-),男,江苏镇江人,本科生㊂通讯作者:丁胜(1970-),男,江苏姜堰人,博士,教授,硕士生导师㊂研究方向:林业产业经济理论及应用㊂责任编辑:付㊀佳摘㊀要:绿色能源行业是我国实现可持续发展的重要支柱行业之一,在金融市场上有一定的关注度,但目前对于绿色能源类债券运用进行定价分析较少㊂以我国发行的绿色可交换债券G 三峡EB1为例,运用二叉树模型对选定的30个交易日内该债券的数据进行加工处理得出理论价格与实际价格对比,并选取同属于绿色能源行业的数支可转债运用模型进行价值分析,针对所得到结果提出了对我国绿色能源行业发展的建议㊂关键词:绿色金融;绿色债券;二叉树模型中图分类号:F832文献标识码:A 文章编号:1673-5919(2023)06-0132-05DOI :10.13691/23-1539/f.2023.06.020Analysis of Green Exchangeable Bonds Based on Binary Tree Model A Case Study of G Three Gorges EB1QIU Jie,ZHANG Hao -ying,LI Jia -xiu,JIA Xin -ran,DING Sheng (College of Economics and Management,Nanjing Forestry University,Nanjing 210037,China)Abstract :China has clearly proposed the dual carbon goals of carbon neutrality and carbon pea-king in order to achieve green and low -carbon development.At present,as one of the important part to achieve this goal,the green energy industry has caught much attention in the bond market,but there is relatively little analysis on the pricing of bonds issued by this industry.This article used bi-nary tree model to process the data of the green exchangeable bond G Three Gorges EB1over a se-lected 30trading day period to obtain a theoretical price and compare it with market prices.It also used the model to process other green energy convertible bonds to achieve the value analysis result.Finally,it provided some suggestions for the development of China s green energy industry based on the results.Key words :Green finance;Green bonds;Binary tree model 1㊀引言可转换债券融合了债券和股权的特性,是一种风险相对较低但具有潜在回报的投资工具㊂而绿色可交换债券作为一种特殊的可转债更强调环保和可持续发展目标㊂这种类型的债券吸引了那些希望投资于环保项目的投资者,同时也提供了较高的灵活性和风险分散㊂绿色能源企业通过发行可交债和可转债,可以有效地筹集资金,保证其可持续发展㊂期权定价中B -S -M 模型和二叉树模型的应用广泛,张敏,姚萍(2021)以百度股票认购期权为例分析B -S -M 模型和二叉树模型的预测效果,得出二叉树模型在美式看跌期权中测度更精确的结论[1]㊂同时滕菲菲(2017)运用二叉树对可转债进行定价研究[2],蒋崇辉和奉琳竣(2021)研究了二叉树模型在运用中定价偏差的影响因素[3]这些学者的研究表明了二叉树模型在可转债的定价应用中具有较高的可行㊀㊀2023年第6期仇㊀杰,等:基于二叉树模型的绿色可交债分析财会金融性,更有不少学者通过二叉树模型研究农林产业相关的可转债定价:方欣,丁胜(2021)以天康转债为例[4],通过二叉树模型对农业可转债定价进行分析;李颖,张胜良(2022)利用二叉树模型对伟20转债为例[5]的众多碳中和领域可转债定价展开研究㊂范梦阳(2023)对比分析了国内外绿色债券的发展情况,指明国内绿色债券的发展前景[6]㊂但目前却鲜有对绿色能源行业所发行的可交债与可转债进行定价分析㊂以上学者主要是基于二叉树定价模型对可转换债券进行分析,并且证明了该模型并非仅仅适用于金融行业的可交换债券,但在目前对于新兴的可交换债券这一种可转债衍生品进行定价分析较少,且对于绿色能源行业这一在未来我国可持续发展中发挥重要作用的行业发行的可转债分析也较少㊂中国作为一个能源需求大国提出了 双碳 目标,这表明绿色能源行业在未来的发展中将扮演一个重要的角色,对其发行的可转债进行模型定价分析具有一定的研究价值㊂本文基于以上学者的研究,将二叉树模型推广运用至一种特殊的可转债即可交债G三峡EB1,对其进行定价分析,再将其推广至绿色能源可转债的定价研究,期望为该行业企业发展提供一定的参考㊂2㊀二叉树定价模型建立本文研究对象为可交换债券,是一种基于可转换债券的创新产品,即可转换债券的衍生品㊂二叉树模型是最常用于金融衍生品定价的工具,在对可转换债券这种较为复杂的期权产品的定价运用中更加适用,该模型的成立需要满足以下几个条件:①没有交易成本和税收;②投资者和发行人都是理性人;③只考虑可转债既不会赎回也不会回售的情形,再根据以下两个基础原理便可开始构建模型㊂2.1㊀模型原理基础①无套利定价原理:无套利定价原理被广泛地应用于可转换债券的定价之中,同时也是二叉树模型的理论基础㊂其内容为当市场中出现套利机会时,投资者会快速地抓住这个机会使得套利机会消失即在这个金融市场中不存在套利机会[7]㊂②风险中性原理:在现实中投资者面对风险时表现出来的各异的态度会导致模型中的无风险率难以确定㊂该原理假设投资者面对风险时表现出中性的态度即风险偏好水平为中性且期望收益率为无风险利率,这样便可以避免上述问题的出现㊂2.2㊀模型的建立首先先规定最新的交易日所处的时间点为T,债券到期日所处时间的为T,在此时标的股票的价格为S㊂到下一个时间点时,股票的价格开始变化有且仅有两种情况:上涨成S u和下跌为S d,在这个过程中影响股票价格数值变动的因子,在股价上涨时称其为上涨幅度u(S u=Su),那么同理在股价下跌时即为下跌幅度d(S d=Sd)㊂在这个过程中期权的价格变化也和股价的变化情况相同,在股价为S u时期权价格为f u,在股价为S d时期权价格为f d㊂现在根据无套利定价原理构建一种无风险债券投资组合,在这个组合中有ә个股票和一个看涨期权的空头头寸,这个投资组合的价值为:Sә-f,且不管股价如何变化这个组合的价值都不会改变即股价上涨时的收益等于股价下跌时的收益:S uә-f u=S dә-f d㊂再利用风险中性原理,可以得到(S uә-f u)∗e-rT=Sә-f,再与上方的公式结合便可得到风险中性概率p的公式p=(e-rT-d)/u-d(e为自然常数),这个概率就是在进入下一个时间点股价可能上涨的概率,且股价只有两种变换状态,那么股价下跌的概率即为1-p㊂再根据以上数据公式与数据,查找相关的文献和资料,要求解上述公式还需要的数据有以下这些:㊀㊀u=eσt;d=1u;a=e rt;p=a-d u-d;上述公式中σ为标的股票的年化波动率,现在将T O到T这一时间段分成n段,n便是二叉树的总步数,时间间隔又称二叉树的步长t=T/n㊂二叉树每走一步股价就会变化一次,期权价格同理,这时模型所需要的公式与数据基本完备,多步二叉树模型也已经构建好㊂3㊀数据分析尽管近几年来绿色金融市场不断发展,绿色债券数量也在不断增加,但目前市场上公开发行的可交换债券本身数量就较为稀少,其中绿色可交换债券数量更为罕见,可用来进行对比分析的有效样本数据㊀㊀财会金融中㊀国㊀林㊀业㊀经㊀济2023年第6期图1㊀多步二叉树示意图较少㊂而可交换债券属于一种特殊的可转换债券,所以主要针对G 三峡EB1,选取同属绿色能源行业的一些可转债在数据处理后进行对比分析,意在从模型定价结果发现目前绿色能源产业债券存在的一些状况㊂3.1㊀目标债券相关信息本文主要分析的债券G 三峡EB1是由中国长江三峡集团有限公司公开发行的少数大众投资者可以投资的AAA 级绿色可交换债券,中国长江三峡集团有限公司其主要业务范围为水力㊁风力等清洁能源发电,新能源开发以及水资源管理与污水的净化处理以及再生利用等生态项目㊂以下是在接下来进行数据分析时所需要的该债券和标的股票的数据所得出的数据表(见表1)㊂表1㊀G 三峡EB1债券信息表参数数值(2023.9.15)债券代码132018债券现值/元148.829债券面额/元100剩余年限/年0.57标的股票最新收盘价/元22.52最新交股价格/元15.92票面利率0.50%3.2㊀模型中参数数值确定①由于该债券在进行实际数据分析时,距离到期日仅有0.57年,时间较短故选取中国银行今年公布的一年期存款利率1.75%作为模型中r 无风险利率的具体值㊂②σ年波动率:通过选取该债券的标的股票在2022年9月15日到2023年9月15日这一时间段共244个交易日的历史收盘价,以此为依据计算每日的收益率,再通过EXCEL 表格中的STDEV 函数便可计算这244天的方差即每日波动率,根据公式:每交易日股价波动方差∗SQRT(每年交易天数)(每年交易天数的平方根)即可以求出年化波动率σ的值约为1.67㊂③由于剩余年限仅有0.57年,规定本文中有效期时间间隔为1%年,即t 的值为57㊂3.3㊀模型结果分析根据以上的公式与数据编写Python 代码,先将2023年9月15日的数据代入程序中得出在不考虑债券回售条款与赎回条款时的理论价格为141.47元与现实市场价格148.83元存在着些许数量差异,但两种价格基本一致,再将这2023年9月15日至2023年8月7日这30个交易日的标的股票的相关数据带入所编写代码便可得到此债券在这30日内的理论价格,再将其进行加工后得到如下的对比图(见图2):图2㊀G 三峡EB1理论价格和实际价格对比图由图2可以清楚地看到这30日内G 三峡EB1的实际市场价格均高于模型计算得出理论价格,这表明它的价值被市场上的投资者们高估了,目前存在着一定的溢价风险,也能看出投资者对其有一定的青睐㊂这反映它能为其对应的绿色项目提供较为良好的流通资金,具有较好的市场流动性㊂同时也可以明确地看出不论是市场价格还是理论价格这两种价格基本一致,它们的波动情况也较为拟合,市场价格上涨时理论价格也在上涨反之亦然,这表明了二叉树模型在债券的定价中的结果是具有一定的合理性,也表明其市场价格变化符合市场规律,没有被一些机构利用进行套利操作㊂关于以上出现的现象,分析得出的主要因素有:①相关政策的激励效应㊂绿色能源可交换债券发展符合 双碳 目标,虽然我国绿色债券起步较晚,但是由于我国政府对其相当重视[8]㊂同时我国的制造业规模巨大,对能源的需求大,同时我国产业要向可持续发展方向转型㊂故绿色能源行业的发展大有前景,导致了相当数量的投资者对其产生了投资偏好,进而对其市场价格产生了正向影响,出现了较高的市场价格㊂②到期日接近㊂在二叉树模型运用中其步长越长,其得出的理论期权价格的精准度越高,在本文选取该债券研究时已经将要到达到期日,模型步长较短,得出的理论价格精准度可能不是特别高,同时实㊀㊀2023年第6期仇㊀杰,等:基于二叉树模型的绿色可交债分析财会金融际价格的高低与其存续期长短也有一定的关系[9]㊂③信用评级影响㊂该债券的发行方为中国最大的清洁能源生产集团之一的长江三峡集团,具有较高的信用评级,在市场上也具备较强的竞争实力与良好的信誉,使得投资者对该债券产生了较高的信心与投资偏好,吸引了投资,故而产生了高于理论价格的市场价格㊂④实际参数波动㊂二叉树模型的成立需要多种假设,是在一个理想的环境中模拟标的股票在未来的可能发展来推断现在期权的价格㊂在模型中上涨和下跌幅度以及风险中性概率都是一个确定值,但在现实中这些指数会随着一些无法预测的外部因素产生一定的波动而产生变化,如果标的股票的涨势良好㊁发行方的发展稳步提升都会对债券的价格产生积极的影响,但二叉树模型的假设前提会排除一定的外部因素,这会导致理论价格与实际价格产生一定差异㊂3.4㊀同类债券数据分析发行该债券的中国长江三峡集团有限公司主营业务为水利发电这一绿色能源行业,尽管目前绿色债券数量在不断增加,但市场上公开发行的可交换债券本身数量就较少,其中绿色可交换债券数量更为罕见,难以选用进行对比㊂但可交债属于可转债的一种衍生品,其定价原理与可转债基本一致㊂故选取市场上四支绿色能源行业的绿色可转债运用所构建的二叉树模型对30个交易日的数据进行分析得到理论价格,再与2023年9月15日的实际市场价格进行对比,如表2所示㊂表2㊀绿色能源可转债理论价格与实际价格对比表可转债名称市场价格/元理论价格/元旺能转债123.07150.79川投转债182.07179.40嘉泽转债140.49126.90节能转债122.05108.78通过比对表2数据可以看出,所选可转债除旺能转债外,得出的理论价格与市场价格较为相似,但依旧存在着一定偏差,这说明二叉树模型在绿色能源可转债的定价分析中具有较高的合理性㊂同时所选的四支绿色能源可转债和G 三峡EB1除旺能转债的价值被低估之外,其余债券的价值均有被一定程度的高估,这表明在现阶段市场上的投资者对与绿色能源行业的投资偏好较高,这与国家对绿色债券的鼓励与扶持政策有一定的关联㊂而旺能转债相较其他债券出现异常情况,可能在现实市场中存在一些机构操控股市进行套利,使得其价格偏离市场规律㊂这种情况的存在与基础原理中的无套利原理相违背,这使得市场价格与理论价格产生了较大的差值㊂在以上五支债券中,仅有G 三峡EB1与川投转债的评级为AAA,发现这两支债券的市场价与理论价的拟合程度相较于其他三支债券的拟合程度更高,误差值较小㊂表明对于高信用评级的可转债,二叉树模型所得理论价格能更加精准地反应债券的实际价值㊂4㊀建议通过以上数据分析的结果和可能存在的一些现象,为绿色能源行业发展提出一些针对建议:①加强监管㊂现实市场中,存在上述所说的一些机构操纵股价套利现象,故需要监管部门健全监督管理机制[10],对一些出现异常价格波动的债券与股票要重点监管,防止套利对市场资金的流通及行业发展产生不良影响㊂②把握利好政策㊂目前我国对绿色债券的宣传和扶持程度较大,绿色能源相关企业要抓住这个机会适当发行和创新绿色金融产品,如像G 三峡EB1这样新兴的可交换债券㊂促进企业项目积极融资,为投资者提供更多选择,活跃绿色金融市场㊂③利用当地优势㊂上述债券大都被一定程度的高估,这说明目前绿色能源行业受到投资者青睐,但存在着一定的溢价风险,同时我国地缘辽阔,天然绿色能源较为丰富㊂相关企业应该在进行项目开发时利用好所在地存在的优势,提高对应绿色债券价值,减少投资者的溢价风险,也保障绿色能源行业融资市场健康发展㊂④提高企业信用㊂从上述G 三峡EB1和川投转债的分析价格与实际价格更加拟合,可以看到拥有高等级的信用债券会对投资者产生一定的投资偏好㊂为吸引更多投资者购买绿色能源行业债券,促进绿色能源行业的发展,该行业的企业需要完善资金流通渠道并持续改善经营状况,以此来努力提高企业的信用评级㊂㊀㊀财会金融中㊀国㊀林㊀业㊀经㊀济2023年第6期目前我国绿色可交债的市场空缺较大,且二叉树模型所得出来的理论价值是通过标的股票的价格根据目标债券的相关信息处理得到的,会忽略现实中好政策㊁项目价值㊁公司信用等外部因素,且对未来可能发生的一些突发情况无法预测,得出的结果有一定局限性和时效性㊂但本文通过构建二叉树模型对G三峡EB1这一绿色能源可交债进行定价分析,从计算结果来看,所得到的30个交易日的结果与市场价基本一致,以及对另外四支绿色能源可转债的分析结果,可以看出该模型在该绿色能源可交换债券和可转换债券的应用结果具有较高的可靠性㊂对于绿色能源行业来说,发行可转债和可交债的目的是为了绿色项目提供健康的流通资金并提高项目的产值,在该行业企业取得更多盈利的同时实现行业的茁壮发展㊂但市场的上利用债券套利现象以及债券被高估后溢价风险的存在会对绿色能源行业的发展产生不利的影响㊂该行业企业在分析得出可能存在这些现象后要及时采取措施,防止市场均衡被破坏㊂本文运用二叉树模型主要对绿色可交债的G三峡EB1进行定价研究,并通过与其他绿色能源可交换债进行对比分析㊂发现了目前绿色能源债券存在的一些状况,并对这些问题进行分析并提出一些建议,为绿色能源行业的可持续发展㊁降低绿色金融体系局限性[11]二叉树模型的推广运用提供了一定的参考㊂参考文献:[1]张敏,姚萍.B-S-M期权定价公式和二叉树模型运用对比分析[J].中国物价,2021(4):69-71.[2]滕菲菲.一种基于二叉树与回归分析法的可转债定价模型研究[J].财经界,2017(6):41-42.[3]蒋崇辉,奉琳竣.基于二叉树模型的可转债定价:定价偏差的影响因素分析[M].金融教育研究,2021,34(1): 21-30.[4]方欣,丁胜,荀晨,等.基于二叉树模型的农业可转债定价研究:以天康转债为例[J].中国林业经济,2021(1): 95-97.[5]李颖,张胜良.基于二叉树模型的碳中和可转债定价研究:以伟20转债为例[J].中国林业经济,2022(3): 83-86.[6]范梦阳.国内外绿色债券市场发展分析[J].财经金融,2023(9):126-128.[7]王宇,张胜良.基于二叉树模型的可转债价值分析:以国君转债为例[J].经济数学,2020,37(1):106-110.[8]范梦阳.国内外绿色债券市场发展分析[J].产业创新研究,2023(17):126-128.[9]苗培熙,顾意刚.基于二叉树模型的银行业可转换债券定价研究[J].中国物价,2020(7):71-73.[10]杨志勇. 双碳 背景下绿色债券的可持续发展探讨[J].中国管理信息化,2023,26(14):146-148.[11]马梅若.转型金融与绿色普惠:把握好绿色金融两大突破方向[N].金融时报,2023-09-21(004).。

STL常见面试题

STL常见面试题

STL常见⾯试题
1. 红⿊树的特性与其在C++ STL中的应⽤
map 、set、multiset、multimap的底层实现都是红⿊树,epoll模型的底层数据结构也是红⿊树,linux系统中CFS进程调度算法,也⽤到红⿊树。

红⿊树的特性:
1. 根节点是⿊⾊
2. 不能有两个连续的红节点
3. 空指针是⿊⾊
4. 从任意⼀个结点出发,到后代中空指针的路径上,均包含相同数量的⿊⾊结点。

2. STL内存分配
3. STL map
4.
5. STL 源码中的 hash 表的实现
6. STL 的 unordered_map 和 map 的区别
7. 介绍⼀下 STL 源码的内容。

8. vector分配内存的⽅式
先申请⼀定的⼤⼩的数组, 当数组填满之后,另外申请⼀块原数组两倍⼤的新数组, 然后把原数组的数据拷贝到新数组, 最后释放原数组的⼤⼩。

详情参考《STL源码剖析(侯捷)》。

问STL库,vector的内存管理,deque的内存管理,list的排序
9. STL也问了⼀些问题:⽐如vecotr 和list 的区别,适⽤情况
vector的扩容机制,问到了源码层次。

1. STL中仿函数有什么⽤,和函数指针有什么不同,哪个效率⾼。

2019年北京大学OJ用什么样的编译oj系统.doc

2019年北京大学OJ用什么样的编译oj系统.doc

北京大学OJ用什么样的编译oj系统作字典和小学生课外读物,因为太厚不可能一口气看完的电视剧,当然你也录音可以作为证据吗用它作为主力教材。

Li man说过了,Josee LaJoie是C++标准委员会原负责人,Barbara E.Moo是独立理财顾问咨询顾问,参与了第一个商业化的卡通使用C++编写的商业产品的开发,领导了公司中第一个C++c语言编译器项目。

C++之父bjarne stroustrup Stroustrup的最后,在UNIX下无论如何都必须翻阅的教材是由公认的Unix编程大师、开源运动领袖人物之一Eric S.Raymond亲自撰写的找书的诀窍可能有一天你会踏入一个别的编程领域,比如人工智能、加解密和密码学、网络与通讯、嵌入式等等,我并没有在这里列出书单,又或者你打算自己找些书。

有什么能快速找到好书的技巧么,除了在线上论坛新闻组等地方寻找别人的推荐评价,在老师和前辈师兄师姐那里咨询之外,还有一个极为简洁的方法,那就是在DirectX中最重要并且最具有代表性的是Direct3D和DirectDraw(在DirectX7.0之后被合并进了Direct3D),它的主要功能就是3D图形。

Direct3D 和OpenGL处于竞争关系,很难评论他们孰优孰劣。

OpenGL专攻图形,而且适用众多平台。

而DirectX可以在Win平台下获得多样的服务,而不止是图形。

应该是你的第一本书。

一句话,大家都说好。

相对于Windows,在UNIX下编程获得相关文档要方便很多。

由于历史原因,能够看到的教材基本上都经受了考验,几乎个个都是经典,不象Win下有鱼龙混杂泥沙俱下的现象。

为了您的安全,请只打开来源可靠的网址来自:来自:图形库,著名的有两个:OpenGL和DirectX。

随后,以下几本书排名不分先后,分属不同方面,想深入的伙计建议都看:宋宝华的《Linux设备驱动开发详解》。

一本介绍Linux设备驱动开发理论、框架与实例的书,是作者多年Linux设备驱动开发淘宝游戏网()从业经验的总结。

泛型技术之发展(上)—JDK1.4上的实现

泛型技术之发展(上)—JDK1.4上的实现

泛型技术之发展(上)—JDK1.4上的实现侯捷【期刊名称】《《Internet信息世界》》【年(卷),期】2002(000)008【摘要】本文介绍了泛型Java的背景知识和一个泛型Java编译器——GJ——的安装方法。

读者基础:有Java语言基础,最好用过Java Collection classes。

本文适用工具:(1)JDK1.4+JSR14 (2)Generic Java(GJ)本文程序源码(javag.bat、Test.java、Employee.Java、JQueue.java)可至侯捷网站下载本文同时也是JavaTwo-2002技术研讨会之同名讲题的书面整理与补充。

【总页数】5页(P73-77)【作者】侯捷【作者单位】【正文语种】中文【中图分类】TP312【相关文献】1.推动技术进步发展循环经济实现炼铁技术、经济、资源和环保的统一——在河北省冶金学会2006年炼铁学术会议上的讲话 [J], 李贵阳2.发展绿色动力推广再制造技术实现循环经济可持续发展--中内协常务副理事长兼秘书长邢敏在中国内燃机行业绿色制造高层论坛上的讲话(摘要) [J],3.广泛深入实施“经济技术创新工程” 为实现我省跨世纪发展目标做贡献——在福建省职工“经济技术创新工程”启动仪式上的讲话 [J], 黄瑞霖4.中国农业发展银行党委委员、副行长刘梅生在全行信息技术工作会议上强调努力实现农业发展银行信息化建设跨越式发展 [J], 关奇峰;顾新胜5.农村养猪存在的主要问题及发展对策杨树速生丰产栽培技术问答(三)农作物秸秆用途广不应一烧了之洞庭湖畔蚌肥珠美驼鸟"明星"陈海华专业合作社帮助农民致富侗乡苗寨科普能人甘当无品官争做有为人中浙优634作熠后稻示范效果与高产栽培技术早春马铃薯一秋冬蒜苗高产高效设施栽培模式辽西半干旱地区实现玉米超高产的关键技术马铃薯受冻后不要轻易毁掉重种春马铃薯高产高效栽培技术甘蓝型中晚熟"双低"油菜的秋发高产栽培川芎的高产栽培技术提高无性系茶苗移栽成活率的技术要点沙糖橘留树保鲜采前落果预防技术缓释肥料在猕猴桃上的使用效果示范套袋苹果坑贮节灌配肥旱作集成技术成年柑橘树全年旋肥技术农业部深入推进农业依法行政 [J],因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

侯捷觀點(系列書評 2/2)【Genericity/STL 大系】《程序員》2001.02 作者簡介:侯捷,臺灣電腦技術作家,著譯評兼擅。

常著文章自娛,頗示己志。

個人網站:北京鏡站:/expert/jjhou如果有一項技術,可以讓你的程式碼處理各種不同的資料型別,甚至是目前未知的資料型別,你喜歡嗎?我會欣喜若狂。

基本上這就是「可復用性(reusibility)」的表現。

當我們有新的資料型態產生,而過去完成的碼完全無需修改即可沿用,不正是一種完美的「可復用性」嗎?物件導向技術中的多型(polymorphism),以及泛型技術中的泛型(genericity)都可以達到這個目標。

它們的字義,也明白標示出其特色。

對大多數人而言,polymorphism(多型技術)早已如雷灌耳,genericity(泛型技術)則稍感陌生。

這是一個你有必要儘快進入的重要領域。

●勤前教育數年前我第一次接觸泛型程式設計(generic programming)與 STL(Standard Template Library)的時候,就深深被它吸引。

雖然那時候我還不怎麼瞭解 STL 裡頭一大堆的術語像是 container、iterator、adaptor、function object、allocator…。

甚至連泛型技術深度依賴的基本技法 C++ template,當時的我都還只一知半解,但光只「泛型」這兩個字就夠把我吸引到那個世界裡面了。

但願我這麼說不至於誤導你把泛型程式設計和 STL 劃上等號。

泛型概念濫觴於Doug McIlroy 於 1968 年發表的一篇著名論文 "Mass Produced Software Components",那篇論文提出了 "reusable components"(可復用軟體組件,又稱為軟體積木或軟體 IC)的願景。

過去數十年中,泛型技術仍屬於研究單位中的驕客,實作產品付之闕如。

直到 C++ 不斷加強 template 機制,並將Alexander Stepanov 創作的 STL 納入標準,泛型技術才終於在標準資料結構和標準演算法領域中有一套可被大眾運用的實作品出現,向現實跨一大步。

讓我們先複習一下。

下面是多型的標準形式:void func(Shape* ps) // Shape 是某個class 繼承體系的基礎類別{// ...ps->draw(); // draw() 是個虛擬函式(virtual function)}func() 的呼叫者可以自由傳入 Shape 繼承體系下任何一個 Shape 衍生類別的物件指標,func() 函式所喚起的將是實際傳入之物件(指標)所對應的那個draw() 虛擬函式。

這種寫法所帶來的好處是,即使將來 Shape 繼承體系衍生出前所未見的子型別,只要該子型別本身提供了 draw() 虛擬函式,上面這個func() 就完全不必更改,可繼續使用。

那麼,泛型又是什麼呢?簡單地說,這是一種「將資料型別參數化」的思維模式。

C++ 的 template 機制就是泛型技術的一個具體載具。

在 C++ 中,不論functions 或是 classes,皆可將其中所需要的資料型別以一個保留器(placeholder)代表,這個保留器亦即所謂的template 參數。

例如 function template:template<typename T1, typename T2)void func(T1 param1, T2 param2) { /* ... */ }或是 class template:template<typename T1, typename T2)class A { /* ... */ }從此,一旦程式中使用上述的 func() 或 class A,例如:func(5, 2.3);A<int, double> a;編譯器即根據 function template 的函式引數(上例的 5 和 2.3),或根據被我們明白標示出來的 class template 引數(上例的 int 和 double),自動推導出一份 function 實體或 class 實體。

這個所謂的具現化動作(instantiation)在編譯期就完成,不會增加執行期的成本。

關於 template 的詳細語法與性能,請參考任何一本完備的 C++ 百科型書籍。

以上這種「將資料型別參數化,再由編譯器視使用當時的情況,為我們完成實體具現化」的概念,即是泛型的實際展現。

template 是 C++ 語言中支援泛型概念的一個工具,而 STL 則是泛型概念的一套實作品。

從學理上來說,STL 其實是一套嚴謹的 "concepts" 分類學。

這裡所謂的concepts有其嚴謹定義,意指「對某種型別的某些條件需求」。

滿足這些條件之型別,稱為該concept的一個model。

舉個例子,如果我們能夠複製型別為 T 之物件,並可以將數值指派給 T 型別的變數身上,那麼型別 T 便符合Assignable這一concept,而 T 便是Assignable的一個model。

STL 的六大組件 containers, algorithms, iterators, function objects, allocators, adaptors, 全都是concepts,實作品如 vector, list, sort(), swap() 等等 templates, ... 全都是model s。

這樣的學理概念,對大部份人勿寧是不可承受之重。

大部份人只著眼 STL 的實用性,因為 STL 非常好用,彈性非常大,執行效率也很理想,可大幅提昇軟體開發效率。

從實作的角度來看,以各種方式完成,符合 STL concepts 需求之各種 C++ classes 和 C++ functions,就是大家一般印象中的 STL,它們實際存在於各個相應的含入檔中,如 <vector>,<functional>, <algorithms>.●剖析 STL任何學習,如果直接從抽象思維開始,對大部份人是一件困難的工作。

通常我們需要一個具體可操作的東西,慢慢再由具象操作轉為抽象思考。

那麼,先學會使用 STL,應該是學習泛型思維的最好途徑。

事實上,自從 STL 以及整個 C++ 標準程式庫定案之後,很多專家,包括 Bjarne Stroustrup,都認為 C++ 程式語言的教學,首先應從如何使用標準程式庫(含 STL)開始。

我當然無法在這篇文章中告訴你 STL 乃至整個標準程式庫的用法。

但是我可以給你一些概念,讓你知道 STL 的架構。

STL 是一個完全以 template 技術完成的程式庫。

它構成了 C++ 標準程式庫的絕大部份骨幹—粗略估計應該佔 80% 以上的面積。

STL 有六大組件(components):1 containers(容器),各種基本資料結構如 vector, list, deque, set, map…,共約 11 種。

其中有些亦被歸類為 adaptors。

2 algorithms(演算法),各種基本演算法如 sort, search, copy, erase…,共約 70 個。

3 iterators(迭代器):應用於容器與演算法身上的一種泛型指標,扮演兩者間的膠著劑。

[Gamma95]對於 iterator 這種設計樣式(design pattern)的定義是:提供一種方法,俾得依序巡訪某個聚合物件(容器)所含的各個元素,而又不需曝露該聚合物件的內部表述方式。

STL 共提供了五種 iterators 型態,以及各種衍生變化。

Iterator 是 STL 中最重要最抽象的一個組件,它使容器與演算法可以各自獨立發展,這是一種突破性的觀念。

不論就實作技術或抽象觀念,iterator 都是 STL 中最關鍵的成份。

瞭解了 iterators,也就進入了 STL 的大門。

4 function object:行為類似 function,但其實是一種 object。

以實作技術而言,這是一個改寫了 "call operator" 的 class。

STL 提供 15 個現成的function objects。

5 adaptors(調適器):用來改變(修飾)其他組件的介面。

[Gamma95]對於adaptor 這種設計樣式(design pattern)的定義是:將一個 class 的介面轉換為另一個 class 的介面,使原本因介面不相容而不能合作的 classes,可以一起運作。

在 STL 中,改變 function object 介面者,稱為 function adaptor,改變 container 介面者,稱為 container adaptor。

改變 iterator 介面者,稱為 iterator adaptor。

例如 STL 提供的兩個容器 queue 和 stack,其實都只不過是 adaptor,修飾了 deque 的介面而成就出另一種容器風貌。

6 allocator(記憶體配置器):容器空間配置系統。

STL 提供有現成的allocator。

下面這個例子,用上了 STL 的所有六種組件,目的是找出某個數列之中數值大於 40 的元素個數,答案為 4。

從這個例子,你可以看到 STL 不同組件間的接合,發展到了一個怎樣靈活的程度,像樂高積木一樣,有無限可能。

#include <algorithm>#include <functional>#include <vector>#include <iostream>using namespace std;int main(){int ia[ ] = { 27, 210, 12, 47, 109, 83, 40 };vector<int, allocator<int> > vec( ia, ia+7 );cout << count_if(vec.begin(), vec.end(),not1(bind2nd(less_equal<int>(), 40)));return 0;}// vector 是一個STL 容器// count_if 是一個STL 演算法// not1 和bind2nd 都是STL function adaptors// less_equal<> 是一個STL function object// allocator<> 是一個STL 記憶體配置器// vec.begin() 和vec.end() 分別傳回兩個iterator,指向容器vec 的頭尾。

相关文档
最新文档