• 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

  • 相关阅读:
    mySQL 重点
    JS代码预解析原理、函数相关、面向对象
    PHP中对数组进行操作的常用函数总结
    js函数和数组总结
    深入理解css网页布局细节
    AngularJS表单验证
    发送消息 缺少 更新的字段值
    springboot 下 logback + MDC的使用
    Mock的使用2
    StringUtils # split 的坑
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3188405.html
Copyright © 2020-2023  润新知