• CStringList 和各给数组的用法


    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<intchar>   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 nIndexARG_TYPE newElement ); nIndex不能越界.

     

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

     

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

     

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

     

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

     

    void InsertAt( int nIndexARG_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根据索引找位置.
  • 相关阅读:
    旅行计划
    两只塔姆沃斯牛
    迷宫
    异或序列
    异或之和
    素数个数
    SAC E#1
    [JSOI2010]Group 部落划分 Group
    [USACO12FEB]附近的牛Nearby Cows
    [HNOI2008]Cards
  • 原文地址:https://www.cnblogs.com/chenzuoyou/p/3119463.html
Copyright © 2020-2023  润新知