我们知道如果是单个的少数几个值弄些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容器类介绍的更多相关文章

  1. Qt容器类之一:Qt的容器类介绍

    一.介绍 Qt库提供了一套通用的基于模板的容器类,可以用这些类存储指定类型的项.比如,你需要一个大小可变的QString的数组,则使用QVector<QString>. 这些容器类比STL ...

  2. MFC CreateWindow介绍

    CreateWindow 该函数创建一个重叠式窗口.弹出式窗口或子窗口.它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的).函数也指该窗口的父窗口或所属窗口(如果存在的话),及窗口的 ...

  3. C++新手之详细介绍MFC

     MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对 ...

  4. MFC 简介

    参考:https://baike.baidu.com/item/MFC/2236974 MFC (微软基础类库) 编辑 锁定 讨论999   MFC(Microsoft Foundation Clas ...

  5. Toolkit Pro学习--Toolbar的创建

    一.新建Toolkit Pro应用程序 安装好Toolkit Pro后,打开VS2008,新建-项目-Toolkit Pro Application.如图1所示. 图1:Toolkit Pro创建窗口 ...

  6. BATJ等大厂最全经典面试题分享

    金九银十,又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百度.蚂蚁金服.小米.乐视.美团.58.猎豹.360.新浪. ...

  7. Android高级工程师面试题整理

    这些题目是网友去百度.小米.乐视.美团.58.猎豹.360.新浪.搜狐等一线互联网公司面试被问到的题目.熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率. 主要分为以下几部分: (1)java ...

  8. 就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这

    原标题:就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这 又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百 ...

  9. Qt相关博客总览

    一.Qt快速入门 Qt快速入门之一:开始学习Qt 与Qt Creator Qt快速入门之二:Qt Creator简介 Qt快速入门之三:Qt程序编译和源码详解 Qt对话框之一:标准对话框 二.Qt窗口 ...

随机推荐

  1. android去掉EditView的默认焦点问题

    在EditText的父级控件中找一个,设置成 <LinearLayout android:layout_width="0dp" android:layout_height=& ...

  2. js 只能输入数字和小数点

    <html><head><meta http-equiv="content-Type" content="text/html;charset ...

  3. LruCache--远程图片获取与本地缓存

    Class Overview A cache that holds strong references to a limited number of values. Each time a value ...

  4. Eclipse插件安装的三种方法

    转自:http://www.blogjava.net/tangzurui/archive/2008/06/30/211669.html  整理了一下格式. (前两种安装方式以多国语言包的安装为例) 1 ...

  5. Javascript实现局部刷新

    <div id="altContent">           要刷新的区域000000</div><input type="button& ...

  6. MFC类目录及头文件(转)

    类 描述 头文件 CAnimateCtrl 自动化通用控件 afxcmn.h CArchive afx.h CArchiveException afx.h CArray afxtempl.h CAsy ...

  7. ajax 访问--提高安全性

    首先受到struts token的启发,产生了客户端发起的ajax请求进行验证的想法,大致思路是客户端每次请求产生一个key ,然后服务端接收到key,然后解析,判断是否为合法key, 对于不带key ...

  8. 数往知来SQL SERVER 视图 触发器 <九>

    SQL server学习_视图 1.视图 视图其实是一张虚拟表,他是一张表的部分数据或多张表的综合数据(视图就是把SQL语句封装起来) 可以看做是一个结果集,但是不是一个结果集 视图不具备存储数据的能 ...

  9. win+r 快速启动应用程序

    如何使用WIN+R快捷键快速启动应用程序呢?其实很简单 首先随便在一个盘上建一个新文件夹,随便取什么名字,最好是英文格式,小编以D盘为例,如图 2. 打开文件夹,单击右键,选择“新建”,单击“快捷方式 ...

  10. wijmo

    wijmo-5官网 Samples Forums Demos 1.当FlexGrid的单元格中文本过长时显示Tooltip 参考1:angular flexGrid tooltip on every ...