vc入門寶典(九) (轉)

gugu99發表於2007-08-15
vc入門寶典(九) (轉)[@more@]

集合類使用心得

/develop/author/netauthor/he_zhidan/">何志丹

MFC提供集合類(Collect)專門負責資料的和管理,MFC的集合類分為三類,分別用於處理三類不同性質的資料結構:表(List,類似於資料結構的雙連結串列),陣列(Array)和對映(Map,具有類似字典的功能).:namespace prefix = o ns = "urn:schemas--com::office" />

一,陣列使用心得

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

簡單地說是你輸入的時候用ARG_TYPE類,輸出的時候用TYPE,自動實現轉換.

具體實現可以看c:program filesmicrosoft vc98mfcincludeafxtempl.h.

如:

#include "afxtempl.h"//那個類需要那些頭可以檢視msdn,在類總括的最後

CArray  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   支援位元組陣列.

CArray    支援字陣列.

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根據找位置.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-958598/,如需轉載,請註明出處,否則將追究法律責任。

相關文章