作者:朱金灿
来源: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的设计哪个你比较认同?理由是什么?
分享到:
相关推荐
STL容器和算法函数表. 玩C++清一定看看STL
STL关联容器入门
该文档详细讲解了C++中标准容器的使用,是一份不错的学习资料哦
STL的容器deque的详细使用方法和文档 6.0代码
后端 / C++ 类 封装 继承 多态 stl容器 虚函数 纯虚函数 友元函数 模板
STL容器,用思维导图的方式表达了一下,其中一些所有容器都通用的函数没有列举如a.size(),a.capacity()等。。希望对各位有帮助.
c++ STL容器使用代码,方便学习 vector string deque queue list set map multiset multimap 容器的API使用方法等
C++/STL容器设计相关ppt及习题,属于教学文档
用三维CAD软件画了一个轮胎的三维模型,并生成了STL文件,已包含在文件夹中了。当然,你也可以重新画三维模型,替换这个STL文件,同样要显示在本程序中。
详细讲解了STL中vector容器的用法.
STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用。下面,我们就浅谈某些常用的...vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2
STL -容器,string容器
STL各种函数讲解
STL容器的一些使用简介
该篇分为十一部分,分别是:vector类的主要成员...stack类的主要成员、queue类的主要成员、priority_queue类的组要成员、set类的主要成员、multiset类的主要成员、map类的主要成员、multimap类的主要成员、STL算法函数
MFC+OpenGL三维绘图(二)——打开一个...要显示其他stl文件 只需要修改OpenGLDrawingView.cpp文件 125行和129行的stl文件路径 .stl和.txt都可以读取 多个stl文件拼接的python代码 为OpenGLDrawing文件夹中的test.py
很全的STL string类的函数方法,便于查询
stl中容器的比较,能对所学的容器有一个很好的认知和对比
STL各种函数详细讲解 简单实用
STL模板与容器资料,容器包含vector,list,deque,set,stack等等,模板主要介绍了函数模板和类模板两种