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窗口 ...
随机推荐
- hadoop完全分布式模式的安装和配置
本文是将三台电脑用路由器搭建本地局域网,系统为centos6.5,已经实验验证,搭建成功. 一.设置静态IP&修改主机名&关闭防火墙(all-root)(对三台电脑都需要进行操作) 0 ...
- http报头正文开头会有一个整数的问题
HTTP/.0 200 OK (省略一些东西...) Content-type:text/html 正文内容 这是我用Arduino访问某个php得到的结果 如果我在php里头输出1000个字符或更少 ...
- myeclipse安装
http://www.cnol.cc/2013/1427.html(我用这个) http://www.myeclipseide.cn/windows.html http://download.csdn ...
- IClassSchemaEdit修改要素类信息
private void ChangeFeatureClassAliasName(IFeatureClass pFeatureClass, string aliasName) { ISchemaLoc ...
- [转]Linux文件权限详解
转自:http://blog.chinaunix.net/uid-25052030-id-174343.html 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问 ...
- jQuery需要掌握的技巧
检查 jQuery 是否加载 在使用 jQuery 进行任何操作之前,你需要先确认它已经加载: if (typeof jQuery == 'undefined') { console.log('jQu ...
- ArcGIS API Reference & Flex API samples学习进度备忘
书签:跳过:另外跳过的内容有待跟进 __________________学习资源: 1.http://help.arcgis.com/en/webapi/flex/apiref/index.html ...
- 正整数N是否是素数
来自:[数据结构与算法分析——C语言描述]练习2.13 问题描述: a. 编写一个程序来确定正整数N是否是素数. b. 你的程序在最坏的情形下的运行时间是多少(用N表示)? c. 令B等于N的二进制表 ...
- Error when running Swift3 in REPL
Traceback (most recent call last): File "", line 1, in NameError: name 'run_one_line' is n ...
- 如何判断Android设备是手机还是平板?
转自:http://blog.csdn.net/zuolongsnail/article/details/8682950 Android开发需要适配手机和平板,有些需求在实现中就要判断设备是手机还是平 ...