STL学习(二)

206 阅读2分钟

一边看侯捷老师(STL源码分析)课程,一边记录下来,仅是给自己当笔记看的。

1.源代码之分布(VC,GCC)

不同编译器的标准库文件分布不同,vc在include文件夹下,GUN C++分布稍微复杂,include/c++/...

2.OOP(面向对象编程)vs GP(泛型编程)

总结:1.所以list是有sort()函数的,它内部由类函数sort()将数据和算法封装在一起。vector和deque是没有模板函数sort(),他们是由标准库提供的::sort(),标准库函数是讲数据和算法分开,采用泛型编程。

2.因为标准库的sort()函数需要的迭代器是具有randomaccess这种特性的,即就是需要的数据空间是连续的,可以完成加几到下一个数据这样的操作,但list不符合标准,他的空间是不连续的,每个数据都是独立的空间,所以他无法供应这样的迭代器。即:标准库sort()是对迭代器有一定要求的,但list不具备,所以它不能使用。

3.操作符重载and模板

源代码中需要了解的是操作符重载和模板,因为被大量使用。 模板:类模板,函数模板,成员模板。

类模板:(泛化,特化)

函数模板:

4.分配器

operator new()和malloc():operator new()函数最终调用都会到malloc()上,vc的分配器没有什么独特设计,它就是调用c的malloc()和free()来分配,它的接口设计使得我们并不好直接用,但容器使用就比较好。

模板用到的分配器都是allocators类

因为的malloc()分配的空间,小的时候,附加空间(额外开销)比例就大,这样就不太好,但通常就是比较小,所以尽量减少malloc()分配的次数。

GUN C++ 2.9真正采用的alloc分配器,他是malloc申请一大块内存,再切分(比较好),但在4.9又恢复成以前的allocators,alloc改成了_pool_alloc()

视频地址:视频链接