第一次用这个模板来写,好像还不错~
只是吧SGI的stl刷了一下,做点小结吧。以后有时间有思考后再一点点的记录。
整个STL的基本功就是模板。类模板函数模板,友元模板,模板半特化,模板半有序,模板全特化,ADL等等语言的特性。因为看的是C++98/03版本的,C++11应该有很多的变化了,模板参数可变应该是最大的变化。估计很多实现都重写了,等看了再总结。
关于STL的一点理解:
1 先说说这几个组件之间的关系。
仿函数本质上还是属于算法,只不过由用户提供。适配器只是给iter, container, algo三个组件增加一层外皮。所以根本上说,就是iter , container, algo。
2 iter。
有点像一个glue,突然想起了以前做egl,也是作为3D渲染core和platform 之间耦合的一层。大部分的algo都是用iter的copy ctor来传递的,免不了效率低了些。而且还有可能iter失效,得看container下面是用什么方式进行的变化。
3 container。
很奇怪有了数组,有了链表,有了树,为什么没有图的container?估计图的表示方式复杂?或者图算法不容易总结?不太清楚了。rb树的理解基本都可以推导到某一种情况(子红,父红,祖父黑,伯父黑)的变色加右旋。hash table的bucket用的质数并基本能够保证load factor 小于1. set/multiset/map/multimap用的都是等价而非相等的比较方式less, 而hashset用的是equal_to.
4 algo。
这块基本就是常用算法了。不过有些名字非常混淆,比如remove,只是移动并未删除。
整个stl里面常用的一种技巧就是提取模板参数类的特征, type_traits这样的技术。基本很多算法的性能优化都是通过静态时类对象的特征来判断下一步调用该怎么走。算是template meta program里面的编译时判别吧。这样的技巧还是挺不错的。