飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5006|回复: 8

vc++入门宝典

[复制链接]
  • TA的每日心情
    开心
    2024-12-1 11:04
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2004-12-12 18:59:48 | 显示全部楼层 |阅读模式
    MFC提供集合类(Collect)专门负责数据对象的存储和管理,MFC的集合类分为三类,分别用于处理三类不同性质的数据结构:表(List,类似于数据结构的双链表),数组(Array)和映射(Map,具有类似字典的功能).

    一,数组使用心得

    原型: template< class TYPE, class ARG_TYPE > class CArray : public Cobject

    简单地说是你输入的时候用ARG_TYPE类,输出的时候用TYPE,自动实现转换.

    具体实现可以看c:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h.

    如:

    #include "afxtempl.h"//那个类需要那些头文件可以查看msdn,在类总括的最后

    CArray<int,  char>   Vars;

    Vars.SetSize(3,1);

    Vars.SetAt(0,'a');

    int x= Vars.GetAt(0);

    这种性质对于自定义类更有效,因为我可以通过重载”=”,来控制改化过程.

    设置断点,我们会发现这个类有三个类成员:m_nSize,m_nMaxSize,m_nGrowBy,分别对应元素个数,已经开辟的空间,空间不足时,每次开辟的多少个元素的空间.

    常见函数:

    int GetSize( ) const得到m_nSize的值.

    int GetUpperBound( ) const;数组的上界,m_nSize-1.

    void SetSize( int nNewSize, int nGrowBy = -1 );三个类成员都会变,以前加的内容不一定丢失.

    void FreeExtra( );整理多余的空间,使m_nMaxSize = m_nSize.

    void RemoveAll( );删除全部元素.

    TYPE GetAt( int nIndex ) const;得到第nIndex(从0开始)元素的值.

    void SetAt( int nIndex, ARG_TYPE newElement ); nIndex不能越界.

    const TYPE* GetData( ) const;将数据指针返回.

    void SetAtGrow( int nIndex, ARG_TYPE newElement );和SetAt类似,如果过大,会开辟新空间.

    int Add( ARG_TYPE newElement );加一个元素,m_nSize加一.

    int Append( const CArray& src );//加上一个同类型的数组.

    void InsertAt( int nIndex, ARG_TYPE newElement, int nCount = 1 );
    void InsertAt( int nStartIndex, CArray* pNewArray );

    TYPE& operator []( int nIndex );以c风格操作数组.

    TYPE operator []( int nIndex ) const;

    其它数组有:

    CByteArray     支持字节数组.

    CWordArray      支持字数组.

    CDWordArray     支持双字节数组.

    CObArray      支持COject类型指针数组.

    CPtrArray       支持Void类型指针数组.

    CUIntArray      支持无符号整形数组.

    CStringArray    支持CString数组.

    用法与上面基本一致.

                                    二,  表使用心得

    我以CStringList为例,谈一下使用表的心得.注意:查看MSDN,实际上看的是CObList,注意相应的类型改成CString类,当然还有一些小差别,具体看vc的提示,最好安装vc_assist6.下面这个例子几乎用到这个类所有的函数.



             CStringList var(15);

             POSITION position;

             position =         var.InsertAfter(NULL,"item1");

             position =  var.InsertAfter(position,"item3");

             position =  var.InsertBefore(position,"item2");



             for( position = var.GetHeadPosition(); NULL != position ; )

                      AfxMessageBox(var.GetNext(position));



             for( position = var.GetTailPosition(); NULL != position ;var.GetPrev(position))

             {

                       CString str;

                       str = var.GetAt(position);

             

                      if("item3"==str)

                       {

                                var.RemoveAt(position);

                       }

                       else

                       {

                                str.MakeUpper();

                                var.SetAt(position,str);

                       }

             

             }



             var.RemoveHead();

             var.RemoveTail();

             var.RemoveAll();

             

             var.AddHead("he");

             var.AddTail("dan");



             position = var.Find("he");

             var.SetAt(position,"He");

             

             position = var.FindIndex(1);

             var.SetAt(position,"Dan");

    //end         

    下面是该类函数的简介.

    POSITION InsertBefore( POSITION position, CObject* newElement );

    POSITION InsertAfter( POSITION position, CObject* newElement );

    在一个位置前或后插入一个新元素.



    POSITION GetHeadPosition( ) const;

    POSITION GetTailPosition( ) const;

    获得头位置和尾位置.

    CObject*& GetNext( POSITION& rPosition );

    CObject* GetNext( POSITION& rPosition ) const;

    CObject*& GetPrev( POSITION& rPosition );

    CObject* GetPrev( POSITION& rPosition ) const;

    获得后一元素或前一元素,注意rPosition会变.

    CObject*& GetAt( POSITION position );

    CObject* GetAt( POSITION position ) const;

    根据位置得到元素.

    void SetAt( POSITION pos, CObject* newElement );

    根据位置设置元素.

    void RemoveAt( POSITION position );

    根据位置删除元素.

    CObject* RemoveHead( );删除并返回头元素

    CObject* RemoveTail( ); 删除并返回尾元素

    POSITION AddHead( CObject* newElement );增加头元素
    void AddHead( CObList* pNewList );在前面加一个表
    POSITION AddTail( CObject* newElement );增加尾元素
    void AddTail( CObList* pNewList );在后面加一个表
    POSITION Find( CObject* searchValue, POSITION startAfter = NULL ) const根据元素值找位置.
    POSITION FindIndex( int nIndex ) const根据索引找位置.
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2020-3-30 17:42
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2005-5-2 23:42:19 | 显示全部楼层
    好东西!怎么没人定~
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-6 12:21
  • 签到天数: 90 天

    [LV.6]常住居民II

    发表于 2005-5-11 20:23:55 | 显示全部楼层
    我来也!
    刚好我正在学哦,以后更老大混!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-9-8 23:24:35 | 显示全部楼层
    这不错啊!!·
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2016-10-21 20:30
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2005-9-12 13:11:50 | 显示全部楼层
    支持一下。。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-3-15 13:00:53 | 显示全部楼层
    太好了,学了不少东西!!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-3-19 13:45:36 | 显示全部楼层
    呵呵,收了,正在学VC
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2015-10-10 22:56
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2006-3-23 13:42:11 | 显示全部楼层
    真是经典啊!谢谢啊!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-3-24 16:18:34 | 显示全部楼层
    是好东西,可惜完全看不懂!!  —   —
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表