STL源码剖析-chapter1

侯捷的源码剖析第一章已经看完,并做了笔记与总结。如下。
注:
1、本人目前仍在在找工作,没有经验,有出错请联系我改正
2、测试环境:g++ -v4.8.4 VS2013
3、CSDN使用不熟练,上传了一份笔记文档,也附上笔记源码(以备文档无法下载)
3、测试代码暂未上传,等学会这一功能(上传.zip文件)一定上传
4、需要代码的请先联系下方

注:
1、本章的知识点已经总结,放在了本文档的最后一部分,没有时间学习、想要直接记结论的朋友直接跳到最后即可
2、完成时间 2018-11-16 11:47(这个阶段本人也是菜鸟在找工作,刚毕业,没有任何项目经验)
3、有出错的地方请告知我,方便我学习改进
4、联系方式
QQ 943588990
引介
1、
在这里插入图片描述
2、会用、明理、能扩展

前言
1、开放性封闭原则
(1)对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
(2)对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
2、出处
(1)空间适配器allocator 第2章
(2)<stl_construct.h> 对象构造与析构的基本函数
(3)<stl_uninitialized.h> 内存管理的基本函数
(4)<stl_algobase.h> 各种基本算法
3、http://www.stlport.org SGI ST为蓝本的高度可移植性实现版本

第一章STL概论与版本简介
一、STL概论
二、STL6大组件
(一)容器containers
(二)算法algorithms
(三)迭代器iterators 所谓的”泛型指针” 共5种类型
1、所有的STL容器都附带自己专属的迭代器
2、原生指针(native pointer)也是一种迭代器
3、迭代器重载了p* p-> p++ p–操作
(四)仿函数functions
1、仿函数是一种重载了 operator()的class或class template
(五)适配器adapters
1、queue、stack只能算是容器配接器,底层借助deque
(六)配置器allocators 负责空间配置与管理
1、从实现角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template

(七)关系图
在这里插入图片描述
(八)
三、GNU源代码开放精神 open source
四、HP实现版本 所有STL版本的始祖
五、PIPlauger版本
继承自HP版本,但不属于 open source范畴
六、Rouge Wave版本
继承自HP版本,但不属于 open source范畴
七、STLport实现版本
八、SGI STL版本 继承自HP版本 oprn source
(一)SGI STL文件分布于简介

(二)SGI STL的编译器组态设置 <stl_config.h>
此处不放置截图了。
(三)令人困惑的C++语法
测试环境 g++、gcc 4.8.4(课本上使用的是GCC for windows)
在这里插入图片描述
VS2013 win8.1
1、重点测试组态:classes、functions
2、组态测试:(GCC常量测试)
(1)测试 __STL_STATIC_TEMPLATE_MEMBER_BUG
(1)g++编译不同过、VS2013运行如下:
虽然是类模板,但是所有实例化后的静态值均按照第一次赋值的值来算;
Static变量可修改,但是所有类模板的static变量的修改后的值最终按照最后一个赋值的值来算;
(2)测试代码另附
(2)测试 ___STL_CLASS_PARTIAL_SPECIALIZATION
(1)g++通过、VS13通过
编写代码时发现类模板竟然可以“重载”,运行时会发生自动匹配现象
(2)代码另附
(3)测试 __STL_FUNCTION_TMPL_PARTIAL_ORDER
(1)g++通过、VS13通过
运行结果显示为空,在VS13中debug发现main()中的swap实际上是调用的C++系统库中的swap()模板
在这里插入图片描述

(2)代码另附
(4)测试 __STL_EXPLICIT_FUNCTION_TMPL_ARGS
(5)测试 __SEL_MEMBER_TEMPLAYES
(1)g++编译报错如下(内部模板类声明出错),VS13运行通过
在这里插入图片描述

(2)代码
在这里插入图片描述

(3)
(6)测试 __STL_LIMITED_DEFAULT_TEMPLATES
(1)g++失败:类模板参数列表定义出错
在这里插入图片描述
(2)VS13运行通过
在这里插入图片描述
(3)G++不支持类模板的参数列表template设置默认值,VS则支持
(7)测试 __STL_NON_TYPE_TMPL_PARAM_BUG
(1)g++通过、VS13通过
(2)本程序我没有明白要测试的目的,但是我从程序代码及运行结果读到的信息是:类模板实例化时也支持默认参数
(3)代码另附
(8)
3、以下组态也在<stl_config.h>定义,使用于整个SGI STL中,有认识的必要
(1)测试 __STL_NULL_TMPL_ARGS(常用于class templates的friend函数声明)
在这里插入图片描述
展开后变成:
在这里插入图片描述
Class template的某个具现体与friend functions template的某个具现体有一对一的关系
(1)测试过 __STL_LIMITED_DEFAULT_TEMPLATES的注意到,它的程序代码与本次测试的代码有相似之处,如下:
在这里插入图片描述
即:STL是否支持类模板的前一个参数作为下一个参数的默认设置值?
答案是:g++(glibc)不支持,但是VS支持
G++编译报错如下:(编译出错一般先看第一个错误)
在这里插入图片描述
本次代码涉及一个问题:如何声明友元友元函数?
如何声明模板类的友元函数?
(2)代码另附(为读者方便,贴图如下)
在这里插入图片描述
(3)
(2)测试 __STL_TEMPLATE_NULL(类模板的明确分工)
定义与使用场合
在这里插入图片描述
展开后:
在这里插入图片描述
使用说明:
在这里插入图片描述
(1)对原代码做的改动
在这里插入图片描述
不做改动时的报错情况(报错:宏前面必须要有template<>)
在这里插入图片描述

(2)编译说明
不做改动时GCC、VS均无法编译
做了改的那个后gCC可以通过,VS不可通过
(3)所谓的明确分工:在声明类模板时指定具体类型
(4)代码另附

(3)
4、临时对象的产生于运用
(1)产生分为两种情况:
1)不在程序员预期之内:如按值传递
2)刻意制造:类型后加()并可设置初值 如int(8);
(2)运用:
可以制造对象的方法常用于仿函数与算法
(3)测试注意说明
VS可以运行通过,G++编译时报错如下(由不支持C++11带来的构造问题)
在这里插入图片描述
解决办法:编译时加上 -std=c++11
在这里插入图片描述

(4)代码另附
5、静态整型常量可以在类内直接初始化
这个其实没有啥说的,记住就行。
测试时添加代码:对静态非const整型常量在类内初始化时g++、VS均失败
对静态const浮点型常量在类内初始化时g++可以运行、VS编译失败
代码另附
6、Increment、decrement、dereference(增加、减少、取值)运算符
(1)此程序中涉及到的知识点
1)++、–运算符的重载问题
2)<<运算符重载函数的写法、位置
3)友元函数的声明
4)占位参数(可以一起复习一下默认参数)
(2)在debug此程序的时候,我发现 I++ 其实走的是占位参数所在的那个函数 --I走的是没有占位参数的那个函数

也就是说,前++、后++的调用问题其实与你的占位参数位置有关。占位参数位置不同,函数调用结果不同
建议的写法(也就是说如果你测试类中++、–重载的问题时想得到与你初学++、–时一样的结果,请看下图)
在这里插入图片描述
(3)针对上述图片阐述的问题,请读者自己debug(代码另附)
(4)<< 、>>运算符重载只能写在类的外部,因为如果写在类内时,调用会出现如下图所示的现象
在这里插入图片描述
在这里插入图片描述
(5)
7、Function call操作符operator(())
(1)涉及到的知识点:c语言函数指针、qsort()用法
在这里插入图片描述
(2)仿函数functor
如果针对某个class进行operator()重载,它就成为一个仿函数functor
仿函数的编译问题
如果类名首字母小写,编译时会提示 “类名”不识别
所以类名都要首字母大写
(3)

                     ***总结:***

STL6大组件:容器、算法、迭代器、仿函数、适配器、配置器
SIG STL opensource
STL编译器组态测试(gcc、g++常量测试)
测试环境 gcc v4.8.4 win VS2013

组态测试结果:
不同的具现体:
如vector vector是vector的不同具现体
仅VS支持:

  • __STL_STATIC_TEMPLATE_MEMBER_BUG
    1、设类模板中有static变量,则有具现体后,所有具现体的该static变量的值均按照第一次赋值来算
    2、该static变量可以修改,所有具现体的该static变量的修改后的值均按照最后一次赋值来算。
    *__SEL_MEMBER_TEMPLAYES
    1、只有类模板参数列表出现过的类型,才可以在类内放心使用

*__STL_LIMITED_DEFAULT_TEMPLATES
1、类模板的参数列表可以出现其他的类模板,其他的类模板可以使用已有的T设置默认类型

#__STL_NULL_TMPL_ARGS
1、普通类内友元函数的声明问题
2、类模板类内友元函数的声明问题

仅g++支持:

__STL_TEMPLATE_NULL(类模板的明确分工)

1、需要添加空的模板声明 template<>
2、所谓的明确分工:在声明类模板时指定具体类型

俩者均支持:
*___STL_CLASS_PARTIAL_SPECIALIZATION
1、类模板可以重载,运行时会自动匹配,见下图
在这里插入图片描述
*__STL_FUNCTION_TMPL_PARTIAL_ORDER(不一定所有的linux系统都定义了该宏)
。。。这个不知道要说啥

*__STL_NON_TYPE_TMPL_PARAM_BUG
1、类模板在使用时支持设置默认参数和缺省传参

临时对象的产生于运用:
1、好处:刻意制造时方便程序员操作
坏处:在传递时会造成内存空间的占用与浪费
2、Eg:
普通类型 int(8);
模板类型 vector(其他的数据类型变量)

静态常量的类内初始化问题
1、Static 整型const变量在类内可以直接初始化(g++、vs均支持)
2、static 非const变量不可在类内初始化
3、static 浮点型 const变量在类内初始化时,g++可运行,vs编译失败

Operator关键字与重载++、–、()、<<、>>
1、重载++、–注意返回值与占位参数
2、类内重载()后盖类就变成了一个仿函数(用法:类名())
Struct是一个特殊的类,内部所谓成员均默认为public
类名首字母要大写。
3、<<、>>的重载只能写在类的外部,方便审美

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值