最近看了下STL的相关知识。不是闲着无事,只是感觉作为一个计算机专业的研究生,不了解STL似乎说不过去,看了以后感觉STL比我想象的要简单些,虽然里面算法很多,但是结构比较单一,容易看懂,不向MFC,前些日子差点挂在MFC里面。不过话说回来,在看MFC源码的过程中,我真的受益匪浅。虽然举步维艰,但是常有恍然大屋之感,也在里面学了不少小技巧和架构知识。相比之下VC中自带的STL库则太过垃圾。MFC的源码那么优秀,咋的STL库就那么渣呢?浏览了下感觉就是天书,命名没有规则,源码格式十分混乱,据说还有很多BUG,所以学习STL一定不能用VC自带的STL库,可以用其他开源的STL库,STLPORT就十分优秀,SGI STL当然也是很不错的。下面简单说说我在学习过程中的一些感受。
首先我们对于泛化这个概念要充分认识,它其实是对类的抽象,和.net里的反射机制有些类似,只是反射是编译器提供的,而泛化只是一个类似宏的功能,目前大多C++编译器对模板的支持并不是太好,这从很多晦涩的编译错误提示可以看出。
STL的结构很简单,容器,算法,迭代器,适配器,函数对象,就这几方面。其中主要是容器和算法,其他都是为他们服务的,如地位显赫的迭代器就是联系容器和算法的桥梁,它对容器和算法实现的解耦起到了关键性作用。关于迭代器,很简单,就是利用运算符重载实现的一个智能指针,也可看成是指针的面向对象版本。适配器是设计模式中Adepter的一个实例,它将一中容器或算法稍作适配,就成了另外一个容器或算法。函数对象和迭代器类似,也是通过运算符重载实现的,值得注意的是,我们可以将一个函数指针直接赋给一个函数对象,编译器会自动做隐式转换,正如我们可以将一个对象指针直接赋给一个迭代器一样。STL的容器很多,但是大多类似,可融会贯通,然而STL的算法更多,而且很多比较难学。当然,对于数据结构学的很好的人来说,应该不在话下。
STL中定义了很多Public类型,提供给外部使用,特别是容器,在每个容器的开始总会看到一大堆typedef,我们在写自己的模板类时可以借鉴,这是种很好的内聚方式。
最后我想说的就是概念这个概念。STL提出了一个概念,叫做概念。这个概念确实有点难懂,而且只是语义上的,大多编译器都不能从语法的角度给予支持。其实我们可以把概念看成是一种协议,这个面向对象语言中的接口类似,就是一个规范。概念是STL的规范,接口是面向对象语言(或者说是软件架构)的规范,而COM等组件则是二进制的规范。这么理解可能有所偏差,但大意应该正确。
好了,我要写的就这些了。STL很看重效率,自然很重视空间结构(容器)和时间结构(算法)。这些东西我感觉了解一二即可,不然容易走火入魔。如果搞一些特别靠低或者很重视效率的东西才需仔细钻研,否则我感觉知道即可。个人意见,呵呵。
首先我们对于泛化这个概念要充分认识,它其实是对类的抽象,和.net里的反射机制有些类似,只是反射是编译器提供的,而泛化只是一个类似宏的功能,目前大多C++编译器对模板的支持并不是太好,这从很多晦涩的编译错误提示可以看出。
STL的结构很简单,容器,算法,迭代器,适配器,函数对象,就这几方面。其中主要是容器和算法,其他都是为他们服务的,如地位显赫的迭代器就是联系容器和算法的桥梁,它对容器和算法实现的解耦起到了关键性作用。关于迭代器,很简单,就是利用运算符重载实现的一个智能指针,也可看成是指针的面向对象版本。适配器是设计模式中Adepter的一个实例,它将一中容器或算法稍作适配,就成了另外一个容器或算法。函数对象和迭代器类似,也是通过运算符重载实现的,值得注意的是,我们可以将一个函数指针直接赋给一个函数对象,编译器会自动做隐式转换,正如我们可以将一个对象指针直接赋给一个迭代器一样。STL的容器很多,但是大多类似,可融会贯通,然而STL的算法更多,而且很多比较难学。当然,对于数据结构学的很好的人来说,应该不在话下。
STL中定义了很多Public类型,提供给外部使用,特别是容器,在每个容器的开始总会看到一大堆typedef,我们在写自己的模板类时可以借鉴,这是种很好的内聚方式。
最后我想说的就是概念这个概念。STL提出了一个概念,叫做概念。这个概念确实有点难懂,而且只是语义上的,大多编译器都不能从语法的角度给予支持。其实我们可以把概念看成是一种协议,这个面向对象语言中的接口类似,就是一个规范。概念是STL的规范,接口是面向对象语言(或者说是软件架构)的规范,而COM等组件则是二进制的规范。这么理解可能有所偏差,但大意应该正确。
好了,我要写的就这些了。STL很看重效率,自然很重视空间结构(容器)和时间结构(算法)。这些东西我感觉了解一二即可,不然容易走火入魔。如果搞一些特别靠低或者很重视效率的东西才需仔细钻研,否则我感觉知道即可。个人意见,呵呵。