有关STL中的容器和MFC的集合类型构造函数区别的一点思考

标签: mfcclassvectoraccessreference微软
4852人阅读 评论(14) 收藏 举报
分类:

作者:朱金灿
来源:
http://blog.csdn.net/clever101

 

      晚上查了一下MSDN,对STL中的容器和MFC的集合类型构造函数区别有所领悟,特写下来和大家分享。不当之处,还望大家赐教!

以前使用MFC的集合类型,即CArray和CMap等类,再使用STL的vector、map等类,感觉最大的区别在于其构造函数。当时我感觉MFC的集合类型的构造函数怪怪的,比如CArray和CMap的构造函数是

 

 

 

   而STL的vector和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的设计哪个你比较认同?理由是什么?

 

 

 

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3850706次
    • 积分:43454
    • 等级:
    • 排名:第79名
    • 原创:749篇
    • 转载:80篇
    • 译文:3篇
    • 评论:2420条
    公告


    真名:朱金灿
    主要经历:本科毕业于CUG(武汉)的GIS专业,毕业后参加工作,现在在北京从事软件开发和团队管理工作。曾获有色金属工业科技进步奖二等奖(获奖证书链接)。
    我的联系方式:
    EMAIL:clever101#163.com
    研究方向:
    数字图像处理、计算机图形学。

    本博客内容除非特殊说明均属原创,如需转载、引用其中的部分文字,请注意以下几点:

    1)如果我的博客侵犯了你的版权,请给我邮件:clever101#163.com,经核实后我会做出合适的处理。

    2)请在转载(引用)的内容提供本博客中相应文章的链接。如你的作品为非电子读物或纯文本,请给出链接的url。

    3)请勿将我的原创文章用于商业用途。

    4)如果愿意,请给我邮件:clever101#163.com,让我知道我的东西到哪去了。谢谢!

    5)我可以尽我所能回复你在评论中提到的问题,但一般不会给你发邮件,所以请勿留邮箱地址.

    文章存档
    最新评论