关闭

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

标签: mfcclassvectoraccessreference微软
4958人阅读 评论(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网站的观点或立场

STL容器与默认拷贝构造函数,默认赋值函数

这两个函数都采用“按成员拷贝”的默认方式来实现。也就是说:它们会依次调用每个数据成员的默认拷贝函数和默认赋值函数,除非为它们显示定义了新的构造函数和赋值函数;如此递归下去,真到所有成员都是基本类型为止...
  • suxinpingtao51
  • suxinpingtao51
  • 2014-08-21 16:08
  • 2293

【C++】STL常用容器总结之八:映射map

9、映射mapMap是键-值对的集合,map中的所有元素都是pair,可以使用键作为下标来获取一个值。Map中所有元素都会根据元素的值自动被排序,同时拥有实值value和键值key,pair的第一元素...
  • hero_myself
  • hero_myself
  • 2016-08-25 12:20
  • 1529

STL之容器作为形参的传递

眼高手低,一看就会,一写就错,刚刚想起来用容器,结果连怎么传参数都忘了。 参考:  http://blog.csdn.net/yishaxiaoyao/article/details/443440...
  • qq_18815817
  • qq_18815817
  • 2017-04-14 21:45
  • 400

stl之set集合容器应用基础

set集合容器使用一种称为红黑树(Red-Black Tree) 的平衡二叉检索树的数据结构,来组织泛化的元素数据。每个节点包含一个取值红色或黑色的颜色域,以利于进行树的平衡处理。作为节点键值的元素的...
  • u010418035
  • u010418035
  • 2015-07-03 19:49
  • 2184

从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法

一、函数对象 1、函数对象(function object)也称为仿函数(functor) 2、一个行为类似函数的对象,它可以没有参数,也可以带有若干参数。 3、任何重载了调用运算符operat...
  • Simba888888
  • Simba888888
  • 2013-07-26 22:14
  • 2729

stl容器的实现原理-与数据结构的对应关系

 STL容器的实现原理    STL共有六大组件  1、容器。2、算法。3、迭代器。4、仿函数。6、适配器。     STL容器的实现原理 STL来管理数据十分...
  • hudfang
  • hudfang
  • 2016-10-26 14:40
  • 1350

STL常用容器总结——queue单向队列

原文 单向队列和栈类似,栈是只在栈顶添加或移除数据,单向队列是从队尾添加数据,从队头移除数据。栈是先进后出(FILO),单向队列是先进先出(FIFO)。在STL中,单向队列也是以别的容器作为底层数据结...
  • sinat_30071459
  • sinat_30071459
  • 2016-04-14 09:53
  • 2521

[C++杂记] STL容器当作参数传递

1、STL容器类自带的拷贝构造函数和符号“=”对容器进行深拷贝 常见的STL容器包括:vector,deque,list,set,multiset,map,multimap,stack,queue,p...
  • yishaxiaoyao
  • yishaxiaoyao
  • 2015-03-17 16:47
  • 2145

STL 查找vector容器中的指定对象:find()与find_if()算法

1 从vector容器中查找指定对象:find()算法    STL的通用算法find()和find_if()可以查找指定对象,参数1,即首iterator指着开始的位置,参数2,即次iterato...
  • master_feng2009
  • master_feng2009
  • 2013-09-20 21:48
  • 7336

C++中STL容器的find的应用

string类的查找函数: int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置 int find(const char *s, ...
  • FENGQIYUNRAN
  • FENGQIYUNRAN
  • 2013-08-02 21:05
  • 1370
    个人资料
    • 访问:4072285次
    • 积分:46266
    • 等级:
    • 排名:第76名
    • 原创:772篇
    • 转载:80篇
    • 译文:3篇
    • 评论:2476条
    公告


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

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

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

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

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

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

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

    文章存档
    最新评论