MFC容器类介绍
我们知道如果是单个的少数几个值弄些int , long,float ,double等类型的变量来装这些值就行了.但如果值太多这样就比较麻烦.当然数据超级多时就直接放数据库里存着去了.
但如果数值不多不少,并且不是业务数据,只是程序中临时用到的数据.咋整呢? 很简单用数组就搞定了.
但数组处理数据来也不够灵活,所以还有其他很多容器类(容器嘛就是用来装东西的,这里是用来装数据.我们可以把所有的容器类看成数组的扩充)
在MFC中容器分三大类:arrays(数组), lists(链表), maps(映射,也称作字典).
MFC中与这在种三种类型对应的模板类分别是
1.CArray<typename TYPE> : 例如CArray<int> , CArray<long> , CArray<float>
详细介绍参考MSDN :http://msdn.microsoft.com/en-us/library/4h2f09ct(v=vs.100).aspx
2.CList<typename TYPE>: 例如CList<int>, CList<long>
详细介绍参考MSDN :http://msdn.microsoft.com/en-us/library/bxde0zae(v=vs.100).aspx
3.CMap<typename key,typename arg_key,typename value,typename arg_value> :例如CMap<int,int,CString,LPCTSTR>这里键是int,值是CString
详细介绍参考MSDN :http://msdn.microsoft.com/en-us/library/s897094z(v=vs.100).aspx
前面的CArray,CList看起来还很美观,用起来也方便.但CMap实在是设计的有点恶心啊.要整成CMap<int,CString>这样就优雅的多啊.
在STL中与之对应的三个类分别是:vector , list , map .其中vector , list的用法跟CArray, CList基本上类似.而map用起来就简单点.直接map<int , string>这样就行
怎么遍历模板容器类
我们知道遍历数组很容易,来个for(int i = 0; i < array.GetCount(); i ++) { int num = array[i]; } .所以MFC中的CArray和STL中的vector都可以用类似的方式遍历.
但是链表和字典就不能通过下标去访问了.所以不能这样整.那咋办呢?
在STL中可以用迭代器iterator非常方便的遍历.以list为例
list<int> myList;
myList.push_back(11); //插入数据
myList.push_back(22);
list<int>::iterator it = myList.begin(); //起始位置
while(it != myList.end())
{
cout<<*it<<endl;
it++;
}
这样用起来虽然方便,但我觉得迭代器iterator这名字起得有点坑爹的,不够直观.太过专业化了.在MFC中没有迭代器的概念,不过有个类似的东东叫POSITION,我觉得这名字是取得非常好,能见名知义.位置嘛,瞧一下就知道它的大概用处了.
下面以为MFC的CList为例看怎么使用POSITION
CList<int> myList;
myList.AddTail(11);
myList.AddTail(22);
int iTmpValue;
POSITION pos = myList.GetHeadPosition();
while(pos)
{
iTmpValue = myList.GetAt(pos);
myList.GetNext(pos);
}
不过我觉得position这名字虽然取得好了,而且用起来也有GetHeadPosition,GetAt这样有实际意义的名字.但有点美中不足的是移到下一个位置的操作不够直观.要是变成pos++,或者pos.MoveNext就更直观了啊.
STL的迭代器iterator和MFC的POSITION,觉得各有所长啊.iterator功能更强大,更灵活.但名字和定义的方式太丑了点.比如还得list<int>:iterator这样整.相较而言POSITION就人性化的多,操作的方法名字都是些有意义的且简单的英语单词.不过缺点是功能少了点,不够灵活.
非模板类
在使用MFC中容器类除了上面3个实际上还有一堆其他功能相似的类.没有用到模板技术的类.而实际上下面这一堆类可以完全不用,直接用上面三种模板类就行了.能达到一样的目的.通过这样一个简单的对比就能体会到模板的威力了吧.那你可能会想既然有那些模板类的会啥还闲着没事整这么一堆类出来啊.模板是后面才有的新技术,下面这些类可能是模板还没出来的时候就设计的.
// Arrays
class CByteArray; // array of BYTE
class CWordArray; // array of WORD
class CDWordArray; // array of DWORD
class CUIntArray; // array of UINT
class CPtrArray; // array of void*
class CObArray; // array of CObject*
// Lists
class CPtrList; // list of void*
class CObList; // list of CObject*
// Maps (aka Dictionaries)
class CMapWordToOb; // map from WORD to CObject*
class CMapWordToPtr; // map from WORD to void*
class CMapPtrToWord; // map from void* to WORD
class CMapPtrToPtr; // map from void* to void*
// Special String variants
class CStringArray; // array of CStrings
class CStringList; // list of CStrings
class CMapStringToPtr; // map from CString to void*
class CMapStringToOb; // map from CString to CObject*
class CMapStringToString; // map from CString to CString
MFC容器类介绍的更多相关文章
- Qt容器类之一:Qt的容器类介绍
一.介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变的QString的数组,则使用QVector<QString>. 这些容器类比STL ...
- MFC CreateWindow介绍
CreateWindow 该函数创建一个重叠式窗口.弹出式窗口或子窗口.它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的).函数也指该窗口的父窗口或所属窗口(如果存在的话),及窗口的 ...
- C++新手之详细介绍MFC
MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对 ...
- MFC 简介
参考:https://baike.baidu.com/item/MFC/2236974 MFC (微软基础类库) 编辑 锁定 讨论999 MFC(Microsoft Foundation Clas ...
- Toolkit Pro学习--Toolbar的创建
一.新建Toolkit Pro应用程序 安装好Toolkit Pro后,打开VS2008,新建-项目-Toolkit Pro Application.如图1所示. 图1:Toolkit Pro创建窗口 ...
- BATJ等大厂最全经典面试题分享
金九银十,又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百度.蚂蚁金服.小米.乐视.美团.58.猎豹.360.新浪. ...
- Android高级工程师面试题整理
这些题目是网友去百度.小米.乐视.美团.58.猎豹.360.新浪.搜狐等一线互联网公司面试被问到的题目.熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率. 主要分为以下几部分: (1)java ...
- 就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这
原标题:就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这 又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百 ...
- Qt相关博客总览
一.Qt快速入门 Qt快速入门之一:开始学习Qt 与Qt Creator Qt快速入门之二:Qt Creator简介 Qt快速入门之三:Qt程序编译和源码详解 Qt对话框之一:标准对话框 二.Qt窗口 ...
随机推荐
- 大数据分析的众包平台—Kaggle
众包(Jeff Howe,2006)是一种在互联网蓬勃发展的背景下产生的一种创新的生产组织形式.在这样的商业模式下,企业利用网络将工作分配出去,通过让更合适的人群参与其中来发现创意和解决技术问题.比较 ...
- rsync同步时报“auth failed on module”错误的可能原因
关于这个auth失败的问题,有以下可能的情况: 1.密码输入错误: 请再次确认你登录用户的密码无误 2.secrets file格式错误: secrets file的文件格式是 upload ...
- android性能小贴士 翻译
转自http://developer.android.com/training/articles/perf-tips.html 性能小贴士: 这篇文档主要一些微优化可以提升应用程序性能,但是这些改变不 ...
- LoadRunner--内存指标介绍
Threads——线程数当前全部线程数============================================ Available MBytes——物理内存的可用数指计算机上可用于运行 ...
- (转) SQL 命令
省的自己总结了 1.终端启动MySQL:/etc/init.d/mysql start:(stop ,restart.)2.登录MySQL:mysql -uroot -p (用root账户登录),然后 ...
- Python在centos下的安装
1.wget http://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz默认下载到主目录下 2.tar xzf Python-2.6.6.tgz 3 ...
- Ubuntu 16.04 Mxnet CPU 版本安装
在安装前配置好更新源,基本要求就是速度越快越好: 1.安装Python apt-get install python 2.安装Git apt-get install git 3.安装依赖包 ...
- C#语言基础01
Console.WriteLine("hello"); Console.ReadKey();// 按一个按键继续执行 string s=Console.ReadLine();//用 ...
- 数往知来SQL SERVER 视图 触发器 <九>
SQL server学习_视图 1.视图 视图其实是一张虚拟表,他是一张表的部分数据或多张表的综合数据(视图就是把SQL语句封装起来) 可以看做是一个结果集,但是不是一个结果集 视图不具备存储数据的能 ...
- ACM2050前传
n在一个平面上有一个圆和n条直线,这些直线中每一条在圆内 同其他直线相交,假设没有3条直线相交于一点,试问这些直线 将圆分成多少区域. 使用递归 F(1)=2; F(n) = F(n-1)+n; ...