CLKing31 ------- MFC配列テンプレートクラスCArray

MFC配列テンプレートクラスCArray

時間2011-12-21

タグ MFC 文字列 ダイアログ バイト ストレージの削除 

オリジナル   http://blog.csdn.net/zyrr159487/article/details/7091171

      MFC配列クラスでサポートされる配列は、C ++の従来の配列と同様であり、任意のデータ型を格納できます。C ++の通常の配列は、使用する前に必要になる可能性のあるすべての要素を保持できるように定義する必要があり、MFC配列クラスによって作成されたオブジェクトは、必要に応じて動的に増減できます。配列の開始添え字は0です。 、上限は固定されており、要素の増加に伴って増加することもあります。メモリ内の配列のアドレスは引き続き継続的に割り当てられます。
  MFCは、配列テンプレートクラスCArrayを定義し、一般的に使用されるさまざまな変数タイプに対してCByteArray、CWordArray、CUIntArray、CDWordArray、CStringArray、CObArray、CPtrArrayを定義します。詳細については、以下の表を参照してください。

配列クラス 可変型 可変値の範囲 ヘッドファイル
CArray テンプレートクラスのパラメータタイプを使用してさまざまなタイプを設定します   Afxtempl.h
CByteArray 8ビット符号なし整数バイトタイプ 0〜255 Afxcoll.h
CWordArray 16ビット符号なし整数WORDタイプ 0〜65535 Afxcoll.h
CDWordArray 32ビット符号なし整数DWORD型 0〜4294967295 Afxcoll.h
CUIntArray 32ビット符号なし整数UINTタイプ 0〜4294967295 Afxcoll.h
CStringArray CString文字列文字列文字列   Afxcoll.h
CObArray CObjectクラスとその派生クラス   Afxcoll.h
CPtrArray void *タイプポインタ   Afxcoll.h

  Boundary   
  GetSize()配列のサイズを返しますGetUpperBound()配列   
  の上限を返します   
  SetSize()配列
    
  操作の  長さを設定し   ます 
  FreeExtra()適用されたが使用されていない余分なコンテンツを解放します   
  RemoveAll()配列     
    
  要素   
  AccessGetAt()配列内の指定された位置を返しますValue
  SetAt()配列内の指定された位置   の値を設定します
    
  ElementAt配列内の指定された位置   の一時参照を返します   
  GetData配列
    
  成長配列をaの   形式で返しますポインタ
  SetAtGrow
  配列の成長範囲を設定し     ます   追加配列に要素を   
  追加します追加この配列に他の配列を追加します
  コピー他の配列を追加します配列をこの配列にコピーし   ます   
    

  挿入と削除   
  InsertAtを配列または他の配列要素
  に挿入して、配列から要素   を削除します。RemoveAt   
    
  演算子   
  演算子[]配列アクセスのサポート   

CByteArray;

 

  ba.Add(66);   
  ba.Add(65);   
  ba.InsertAt(1,69);   
    
  ba.RemoveAt(2);   
  BYTE   i   =   ba[1];   
  ba.RemoveAll();   

 

 

 

MFC配列クラスの使用方法は基本的に同じです。以下では、配列クラスの使用法を説明するために、例としてCArrayとCUIntArrayを使用しています。

 

1CArrayを使用する 

 

 

VC ++ 6.0を開き、ダイアログベースのプロジェクトアレイを作成します。CArrayDlgクラス宣言ファイル(ArrayDlg.h)にステートメントを追加します。#include <afxtempl.h>注意:CArrayを使用するには、ヘッダーファイルafxtempl.hをインクルードする必要があります。 

メインダイアログリソースIDD_ARRAY_DIALOGを開き、ボタンIDC_ARRAY_CPOINTを追加します。タイトルはCArray_CPointです。ボタンをダブルクリックし、OnArrayCpoint()関数に次のコードを追加します。 

 

void CArrayDlg::OnArrayCpoint()
{
CArray<CPoint,CPoint&> m_Array;
m_Array.SetSize(10,10);
CPoint pt1(10,10);
m_Array.Add(pt1);
CPoint pt2(10,50);
m_Array.Add(pt2);
CPoint pt3(10,100);
m_Array.Add(pt3);
int size=m_Array.GetSize();
CClientDC dc(this);
dc.MoveTo(0,0);
CPoint pt;
for(int i=0;i<size;i++)
{
pt=m_Array.GetAt(i);
dc.LineTo(pt);
}
}

 

 

コードの簡単な説明: 

CArray <CPoint,CPoint&> m_Array;

このステートメントは、CArray配列オブジェクトを定義します。テンプレートクラスCArrayには2つのパラメーターがあります。最初のパラメーターは配列要素のタイプです。この例では、CPointです。つまり、m_ArrayはCPoint配列であり、2番目のパラメーターは参照です。タイプであり、通常は2つのタイプがあります。選択肢は、最初のパラメータータイプと同じです。つまり、配列オブジェクトがパラメーターとして渡されると、配列オブジェクトが渡されます。2番目のオプションは、最初のパラメータータイプの参照です。これは、配列オブジェクトがパラメーターとして渡されるときに、配列オブジェクトへのポインターが渡されることを意味します。したがって、特により複雑な配列構造タイプの場合は、この例でCPoint&を使用するのと同じように、メモリを節約し、プログラムの実行速度を高速化する参照受け渡しを使用することをお勧めします。 

m_Array.SetSize(10,10);

SetSize関数は、配列のサイズを設定します。この関数には2つのパラメーターがあります。最初のパラメーターは配列のサイズを設定し、2番目のパラメーターは配列が大きくなるときのメモリ割り当てのサイズを設定します。デフォルト値は-1です。デフォルト値。これにより、メモリ割り当てがより合理的になります。この例では、2番目のパラメーターは10です。これは、配列要素を追加すると、配列に10要素のメモリが割り当てられることを意味します。

SetSize関数を使用して、いつでも配列のサイズを設定できます。最初のパラメーター値が配列内のメンバーの数よりも少ない場合、最初のパラメーター値を超​​えるメンバーは切り捨てられ、対応するメモリは切り捨てられます。解放されます。CArray配列を使用する前に、SetSizeを使用してサイズを決定し、ストレージスペースを適用することをお勧めします。これを行わないと、配列に要素を追加するときに、要素を絶えず移動およびコピーする必要があり、非効率とメモリの断片化が発生します。 

Add関数は、配列要素を追加します。 

 

    m_Array.Add(pt1);

 

GetSizeは、配列要素の数を返します。 

 

     int size=m_Array.GetSize();

 

視覚的に表示するために、このコードは各配列要素を画面上のポリラインに描画します。GetAt(int index)は、インデックス値を介して対応する要素値を取得します。プログラムをコンパイルして実行し、結果を観察します。

 

 

for(int i=0;i<size;i++)
   {
    pt=m_Array.GetAt(i);
    dc.LineTo(pt);
   }

 

メインダイアログリソースIDD_ARRAY_DIALOGを再度開き、ボタンIDC_ARRAY_CSTRINGを追加します。タイトルはCArray_CStringです。ボタンをダブルクリックし、OnArrayCstring()関数に次のコードを追加します。 

 

 

void CArrayDlg::OnArrayCstring()
{
CArray<cstring,cstring&> m_string;
CString sztiger("tiger");
CString szbear("bear");
CString szdog("dog");
m_string.SetAtGrow(0,sztiger);
m_string.SetAtGrow(2,szdog);
m_string.InsertAt(1,szbear);
int count=m_string.GetSize();
CClientDC dc(this);
dc.SetBkMode(TRANSPARENT);
TEXTMETRIC textMetric;
dc.GetTextMetrics(&textMetric);
int fontHeight=textMetric.tmHeight;
int displayPos=10;
for(int x=0;x<count;++x)
{
dc.TextOut(10,displayPos,m_string[x]);
displayPos+=fontHeight;
}
AfxMessageBox("Continue...");
m_string.RemoveAt(2);
count=m_string.GetSize();
for(x=0;x<count;++x)
{
dc.TextOut(10,displayPos,m_string[x]);
displayPos+=fontHeight;
}
AfxMessageBox("A string has delete,continue...");
m_string.RemoveAll();
count=m_string.GetSize();
if(count==0)
AfxMessageBox("All elements are deleted.");
}
Carray<cstring,cstring&> m_string;

 

コードの簡単な説明: 

m_string.SetAtGrow(2,szdog);

SetAtGrowには2つのパラメーターがあり、最初のパラメーターは配列要素のシーケンス番号値を決定し、2番目のパラメーターは要素の値です。この関数は、対応する配列要素の値をシリアル番号の値に従って設定します。この関数はSetAtに似ています。違いは、この関数を使用して要素の値を設定する場合、シリアル番号の値がの上限よりも大きい場合です。アレイの場合、アレイは自動的に大きくなります。プログラムをコンパイルして実行します。注意深く読むと、1行目の文字が「tiger」で、2行目の文字が「bear」であることがわかります。これは予想どおりですが、3行目は空です。文字列、4行目は「犬」です。空の文字列はどのように発生しますか?次の3行のコードを分析することで知ることができます。 

 

m_string.SetAtGrow(0,sztiger);
    m_string.SetAtGrow(2,szdog);
    m_string.InsertAt(1,szbear);

 

最初の行は要素0を「tiger」に設定しますが、これは疑いの余地がありません。2行目では、要素2を「dog」に設定していますが、要素2を設定すると、要素1は自動的に空の文字列で埋められます。3行目では、要素1として「クマ」を挿入し、元の要素1と要素2を要素2と要素3に戻します。

今回はどう思いますか?

m_string.InsertAt(1,szbear);

InsertAt関数は、指定されたシーケンス番号で対応する要素を挿入します。この関数の実行中、挿入ポイントの後ろの要素は自動的に戻ります。dc.TextOut(10、displayPos、m_string [x]);中でも、m_string [x]は演算子[]に対する配列クラスのオーバーロードであり、配列クラスCArrayでは[]演算子を次のように使用できます。 C ++の通常の配列。m_string [x]は、m_string.GetAt(x)に置き換えることもできます。 

m_string.RemoveAt(2);

RemoveAtには、要素番号値という1つのパラメーターしかありません。この関数は、要素番号の値に従って対応する要素の値を削除し、次の要素が自動的に前進します。 

m_string.RemoveAll();

RemoveAllすべての要素値を削除します

 

2CUIntArrayクラスの使用法を示します

 

 

メインダイアログリソースIDD_ARRAY_DIALOGを開き、CUIntArrayというタイトルのボタンIDC_CUINTARRAYを追加し、ボタンをダブルクリックして、OnCuintarray()関数に次のコードを追加します。

コードのこの部分は説明されていません。自分で分析してください。

最後のポイント:RemoveAt関数とInsertAt関数は、操作時に配列要素をシフトし、実行時間はSetAt、RemoveAll、およびAdd関数よりも長くなります。 

この記事がお役に立てば幸いです。

 

void CArrayDlg::OnCuintarray()
{
CUIntArray m_array;
m_array.SetSize(5,5);
m_array.SetAt(0,0);
m_array.SetAt(1,1);
m_array.SetAt(2,2);
m_array.SetAt(3,3);
m_array.SetAt(4,4);
int count=m_array.GetSize();
CClientDC dc(this);
dc.SetBkMode(TRANSPARENT);
TEXTMETRIC textMetric;
dc.GetTextMetrics(&textMetric);
int fontHeight=textMetric.tmHeight;
int displayPos=10;
for(int x=0;x<count;++x)
{
CString str;
str.Format("%d",m_array.GetAt(x));
dc.TextOut(10,displayPos,str);
displayPos+=fontHeight;
}
}

関連記事

おすすめ

転載: blog.csdn.net/qq_43662480/article/details/114561709