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窗口 ...
随机推荐
- c# 修改appConfig文件节点
配置文件对于程序的帮助是不可小视的,尤其是java工程师们,当然了,我这里说的是c#的配置文件.废话不多说了,直接上代码了,想必大家一看就会明白了 private string UpdateConfi ...
- 用于科创的git log美化输出
git log --reverse --pretty=format:'%cd %s' --date=short > a.txt 更好的: git log --reverse --pretty=f ...
- 对话框式Activity的设置
<activity android:name=".OtherActivity" android:label="@string/app_name" andr ...
- SQL0668N 由于表 "db2inst1.test" 上的原因代码 "3",所以不允许操作(解因为LOAD引起的LOAD暂挂状态锁)
DB2解因为LOAD引起的LOAD暂挂状态锁 一般解锁命名是,SET INTEGRITY FOR temp_test IMMEDIATE CHECKED 但是load暂挂状态是解不了的,可以l ...
- Asp.net 访问数据库的几种方式
ASP.NET中连接数据库的各种方法 连接SQL数据库的方法:(一).在Web.Config中创建连接字符串:1.<add name="ConnectionString" c ...
- [再寄小读者之数学篇](2014-11-19 $\tan x/x$ 在 $(0,\pi/2)$ 上递增)
$$\bex \frac{\tan x}{x}\nearrow. \eex$$ Ref. [Proof Without Words: Monotonicity of $\tan x/x$ on $(0 ...
- Selenium2Library系列 keywords 之 _SelectElementKeywords 之 select_all_from_list(self, locator)
def select_all_from_list(self, locator): """Selects all values from multi-select list ...
- 记录一次cefsharp1输入法在win7下异常解决定位
最近几天都被基于cefSharp封装的浏览器控件搞疯了!对于cefSharp基本满足当前所做项目的需求,但是有一个问题一直困扰我,那就是系统中偶尔会出现输入法不能转换到中文.而且这个问题似乎没有什么规 ...
- 虚幻4以及DX12将允许开发者利用Xbox One的更多性能(转)
GamingBolt 最近采访了 Epic Games 的总经理 Ray Davis,讨论了有关旗下虚幻引擎(Unreal Engine)的议题.在这次的访谈中,Ray 解释了关于使用 DirectX ...
- Android学习之散乱的知识点
1. 安卓广告知名平台:有米,哇棒,架势,admob(国外,但效果不好)等,推荐用有米 2. src目录为源文件目录,所有可以被用户修改和创建的Java文件将被存放在这个目录下 3. xml中引用st ...