链接:有关STL中的容器和MFC的集合类型构造函数区别的一点思考    晚上查了一下MSDN,对STL中的容器和MFC的集合类型构造函数区别有所领悟,特写下来和大家分享。不当之处,还望大家赐教!    以前使用MFC的集合类型,即CArray和CMap等类,再使用STL的vector、map等类,感觉最大的区别在于其构造函数。当时我感觉MFC的集合类型的构造函数怪怪的,比如CArray和CMap的构造函数是
template < class TYPE, class ARG_TYPE = const TYPE& > 
class CArray : 
   public CObjecttemplate< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap : public CObject
   而STL的vector和map的构造函数形式如下:
template <
   class Type, 
   class Allocator = allocator<Type> 
>
class vectortemplate <
   class Key, 
   class Type, 
   class Traits = less<Key>, 
      class Allocator=allocator<pair <const Key, Type> > 
>
class map   
(这里值得注意的是STL中的vector的构造函数的模板参数为2个,map为4个,但是vector的第二个、map中的第三个和第四个参数都是可选参数,我们在绝大多数情况下都使用其默认值)     当初我觉得MFC的集合类真是繁琐,特别是CMap,需要用户填充四个参数。试想一个动态数组类,用户只需提供一个数组元素类型就可以了,一个字典(即map),用户只需提供键值类型和元素类型就可以了,这是一个多么符合自然的设计!同时我认为一个程序库的类和函数接口的设计的一个重要原则应是接口的参数应尽量少和符合一般思路,因为这会大大降低用户使用库的难度。那时我很难理解MFC的集合类型的设计,我想微软的设计人员是不是脑子进水了?     今晚看MSDN,偶尔看到CArray类的第二个参数的解释:
ARG_TYPE
Template parameter specifying the argument type used to access objects stored in the array. Often a reference to TYPE. ARG_TYPE is a parameter that is passed to CArray.    让我翻译一下:ARG_TYPE模板参数是用来指定访问数组的参数类型,通常是TYPE(数组元素类型)的引用。ARG_TYPE是一个传递给CArray的参数。   我看到access这个单词(中文译为访问)突然有所领悟。实际上在这句话中access正是关键词。访问在一个动态数组中涉及到哪些方面呢?我想到两方面:一是速度;二是数据访问权限。所谓速度,是指访问数组元素,是直接构造一个元素类型的临时变量,还是使用其引用类型或指针什么的。C++中对于简单类型、及简单类型的引用或指针,其访问速度是一样的,但对于复杂类型,显然使用引用或指针访问速度更快(不太明白其中原理的同学请参考《深度探索C++模型》,这里不作详述)。数据访问权限我想到的一种的情况应该是为了防止用户不小心修改了数据而设定常量类型,就是通过设定访问类型来达到保护数据的目的。STL是如何应对这方面的问题的呢?用过STL的同学估计都知道STL通过使用迭代器来解决这方面的问题,如常量迭代器就是为了保护数据的。而MFC中没有迭代器类型,所以通过这种办法来解决。    最后我想说的是:即使我大致明白了MFC集合类型的设计思路,但我还是比较认同STL的设计,一则STL的设计比较自然,合符人的思路,二则通过增加迭代器类型使得类的职责更为分明(迭代器类就是主要承担容器的访问功能的)。思考题:    MFC集合类型的设计和STL的设计哪个你比较认同?理由是什么?