Mfc-carray
MFC-CArray
*CArray* は、ランダムまたは非シーケンシャルな方法でアクセスされるデータに最適なコレクションです。 CArrayクラスは、C配列のような配列をサポートしますが、必要に応じて動的に縮小および拡大できます。
- 配列インデックスは常に位置0から始まります。
- 現在の境界を超えて要素を追加するときに、上限を修正するか、配列を展開できるようにするかを決定できます。 *一部の要素がnullであっても、メモリは上限に連続して割り当てられます。
____これはCArrayクラスのメソッドのリストです。
Sr.No. | Name & Description |
---|---|
1 |
配列の最後に要素を追加します。必要に応じて配列を拡大します。 |
2 |
Append 別の配列を配列に追加します。必要に応じて配列を拡大します |
3 |
Copy 別の配列を配列にコピーします。必要に応じて配列を拡大します。 |
4 |
ElementAt 配列内の要素ポインターへの一時的な参照を返します。 |
5 |
FreeExtra 現在の上限を超える未使用のメモリをすべて解放します。 |
6 |
GetAt 現在の上限を超える未使用のメモリをすべて解放します。 |
7 |
GetCount この配列内の要素の数を取得します。 |
8 |
GetData 配列内の要素へのアクセスを許可します。 NULL にすることができます。 |
9 |
GetSize この配列内の要素の数を取得します。 |
10 |
GetUpperBound 最大の有効なインデックスを返します。 |
11 |
InsertAt 指定されたインデックスに要素(または別の配列のすべての要素)を挿入します。 |
12 |
IsEmpty 配列が空かどうかを判別します。 |
13 |
RemoveAll この配列からすべての要素を削除します。 |
14 |
RemoveAt 特定のインデックスの要素を削除します。 |
15 |
SetAt 特定のインデックスの値を設定します。配列は拡大できません。 |
16 |
SetAtGrow 特定のインデックスの値を設定します。必要に応じて配列を拡大します。 |
17 |
SetSize この配列に含まれる要素の数を設定します。 |
以下は、CArrayオブジェクトのさまざまな操作です-
CArrayオブジェクトを作成
CArray値またはオブジェクトのコレクションを作成するには、まずコレクションの値のタイプを決定する必要があります。 int、CString、doubleなど、既存のプリミティブデータ型のいずれかを使用できます。 以下に示すように。
CArray<CString, CString>strArray;
アイテムを追加
- アイテムを追加するには、CArray
- Add()関数を使用できます。 配列の最後にアイテムを追加します。 OnInitDialog()では、CArrayオブジェクトが作成され、次のコードに示すように3つの名前が追加されます。
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
アイテムを取得する
- アイテムを取得するには、CArray
- GetAt()関数を使用できます。 この関数は、配列のインデックスとして1つの整数パラメーターを取ります。
- ステップ1 *-すべての名前を取得する簡単な例を見てみましょう。
//Retrive names from CArray
for (int i = 0; i < strArray.GetSize(); i++) {
m_strText.Append(strArray.GetAt(i) + L"\n");
}
- *ステップ2 *-CMFCCArrayDlg
- OnInitDialog()の完全な実装です。
BOOL CMFCCArrayDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
//Set the icon for this dialog. The framework does this automatically
//when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); //Set big icon
SetIcon(m_hIcon, FALSE); //Set small icon
//TODO: Add extra initialization here
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
//Retrive names from CArray
for (int i = 0; i < strArray.GetSize(); i++) {
m_strText.Append(strArray.GetAt(i) + L"\n");
}
UpdateData(FALSE);
return TRUE;//return TRUE unless you set the focus to a control
}
- ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。
中間にアイテムを追加
配列の中央にアイテムを追加するには、CArray ::。InsertAt()関数を使用できます。 これには2つのパラメータが必要です。1つ目はインデックスで、2つ目は値です。
次のコードに示すように、インデックス1に新しいアイテムを挿入しましょう。
BOOL CMFCCArrayDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
//Set the icon for this dialog. The framework does this automatically
//when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); //Set big icon
SetIcon(m_hIcon, FALSE); //Set small icon
//TODO: Add extra initialization here
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
strArray.InsertAt(1, L"Allan");
//Retrive names from CArray
for (int i = 0; i < strArray.GetSize(); i++) {
m_strText.Append(strArray.GetAt(i) + L"\n");
}
UpdateData(FALSE);
return TRUE;//return TRUE unless you set the focus to a control
}
上記のコードをコンパイルして実行すると、次の出力が表示されます。 これで、2番目のインデックスとしてAllan ddedという名前が表示されます。
アイテムの値を更新
配列の中央の項目を更新するには、CArray ::。SetAt()関数を使用できます。 これには2つのパラメータが必要です。1つ目はインデックスで、2つ目は値です。
次のコードに示すように、配列の3番目の要素を更新しましょう。
BOOL CMFCCArrayDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
//Set the icon for this dialog. The framework does this automatically
//when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); //Set big icon
SetIcon(m_hIcon, FALSE); //Set small icon
//TODO: Add extra initialization here
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
strArray.InsertAt(1, L"Allan");
strArray.SetAt(2, L"Salman");
//Retrive names from CArray
for (int i = 0; i < strArray.GetSize(); i++) {
m_strText.Append(strArray.GetAt(i) + L"\n");
}
UpdateData(FALSE);
return TRUE;//return TRUE unless you set the focus to a control
}
上記のコードをコンパイルして実行すると、次の出力が表示されます。 これで、3番目の要素の値が更新されていることがわかります。
配列をコピー
- 配列全体を別のCArrayオブジェクトにコピーするには、CArray
Copy()関数を使用できます。
*Step1* -次のコードに示すように、別の配列を作成し、最初の配列からすべての要素をコピーします。
BOOL CMFCCArrayDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
//Add "About..." menu item to system menu.
//IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL) {
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty()) {
pSysMenu→AppendMenu(MF_SEPARATOR);
pSysMenu→AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
//Set the icon for this dialog. The framework does this automatically
//when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); //Set big icon
SetIcon(m_hIcon, FALSE); //Set small icon
//TODO: Add extra initialization here
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
strArray.InsertAt(1, L"Allan");
strArray.SetAt(2, L"Salman");
CArray<CString, CString>strArray2;
strArray2.Copy(strArray);
//Retrive names from CArray
for (int i = 0; i < strArray2.GetSize(); i++) {
m_strText.Append(strArray2.GetAt(i) + L"\n");
}
UpdateData(FALSE);
return TRUE;//return TRUE unless you set the focus to a control
}
これで、2 ^ nd ^配列から要素を取得したことがわかります。コピー関数を使用したため、出力は同じです。
アイテムを削除
- 特定の項目を削除するには、CArray
- RemoveAt()関数を使用できます。 リストからすべての要素を削除するには、CArray :: RemoveAll()関数を使用できます。
配列から2番目の要素を削除しましょう。
BOOL CMFCCArrayDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE); //Set big icon
SetIcon(m_hIcon, FALSE); //Set small icon
//TODO: Add extra initialization here
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
strArray.InsertAt(1, L"Allan");
strArray.SetAt(2, L"Salman");
CArray<CString, CString>strArray2;
strArray2.Copy(strArray);
strArray2.RemoveAt(1);
//Retrive names from CArray
for (int i = 0; i < strArray2.GetSize(); i++) {
m_strText.Append(strArray2.GetAt(i) + L"\n");
}
UpdateData(FALSE);
return TRUE;//return TRUE unless you set the focus to a control
}
上記のコードをコンパイルして実行すると、次の出力が表示されます。 これで、Allanという名前が配列の一部ではなくなっていることがわかります。