MFC - CArray
CArrayè una raccolta che viene utilizzata al meglio per i dati a cui si deve accedere in modo casuale o non sequenziale. La classe CArray supporta array che sono come array C, ma possono ridursi dinamicamente e crescere secondo necessità.
Gli indici di matrice iniziano sempre dalla posizione 0.
È possibile decidere se correggere il limite superiore o abilitare l'espansione dell'array quando si aggiungono elementi oltre il limite corrente.
La memoria viene allocata in modo contiguo al limite superiore, anche se alcuni elementi sono nulli.
Sr.No. | Nome e descrizione |
---|---|
1 | Add Aggiunge un elemento alla fine dell'array; aumenta l'array, se necessario. |
2 | Append Aggiunge un altro array all'array; aumenta l'array, se necessario |
3 | Copy Copia un altro array nell'array; aumenta l'array, se necessario. |
4 | ElementAt Restituisce un riferimento temporaneo al puntatore dell'elemento all'interno della matrice. |
5 | FreeExtra Libera tutta la memoria inutilizzata al di sopra del limite superiore corrente. |
6 | GetAt Libera tutta la memoria inutilizzata al di sopra del limite superiore corrente. |
7 | GetCount Ottiene il numero di elementi in questa matrice. |
8 | GetData Consente l'accesso agli elementi nell'array. Può essereNULL. |
9 | GetSize Ottiene il numero di elementi in questa matrice. |
10 | GetUpperBound Restituisce l'indice valido più grande. |
11 | InsertAt Inserisce un elemento (o tutti gli elementi in un altro array) in corrispondenza di un indice specificato. |
12 | IsEmpty Determina se la matrice è vuota. |
13 | RemoveAll Rimuove tutti gli elementi da questo array. |
14 | RemoveAt Rimuove un elemento in corrispondenza di un indice specifico. |
15 | SetAt Imposta il valore per un dato indice; array non autorizzato a crescere. |
16 | SetAtGrow Imposta il valore per un dato indice; aumenta l'array, se necessario. |
17 | SetSize Imposta il numero di elementi da contenere in questo array. |
Di seguito sono riportate le diverse operazioni sugli oggetti CArray:
Crea oggetto CArray
Per creare una raccolta di valori o oggetti CArray, è necessario prima decidere il tipo di valori della raccolta. È possibile utilizzare uno dei tipi di dati primitivi esistenti come int, CString, double ecc. Come mostrato di seguito;
CArray<CString, CString>strArray;
Aggiungi elementi
Per aggiungere un elemento è possibile utilizzare la funzione CArray :: Add (). Aggiunge un elemento alla fine dell'array. In OnInitDialog (), l'oggetto CArray viene creato e vengono aggiunti tre nomi come illustrato nel codice seguente.
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
Recupera elementi
Per recuperare qualsiasi elemento, è possibile utilizzare la funzione CArray :: GetAt (). Questa funzione accetta un parametro intero come indice dell'array.
Step 1 - Vediamo un semplice esempio, che recupererà tutti i nomi.
//Retrive names from CArray
for (int i = 0; i < strArray.GetSize(); i++) {
m_strText.Append(strArray.GetAt(i) + L"\n");
}
Step 2 - Ecco l'implementazione completa di 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
}
Step 3 - Quando il codice sopra è stato compilato ed eseguito, vedrai il seguente output.
Aggiungi elementi nel mezzo
Per aggiungere un elemento al centro dell'array è possibile utilizzare la funzione CArray ::. InsertAt (). Richiede due parametri: il primo, l'indice e il secondo, il valore.
Inseriamo un nuovo elemento all'indice 1 come mostrato nel codice seguente.
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
}
Quando il codice sopra viene compilato ed eseguito, vedrai il seguente output. Ora puoi vedere il nome Allan dded come secondo indice.
Aggiorna valore articolo
Per aggiornare l'elemento al centro dell'array è possibile utilizzare la funzione CArray ::. SetAt (). Richiede due parametri: il primo, l'indice e il secondo, il valore.
Aggiorniamo il terzo elemento dell'array come mostrato nel codice seguente.
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
}
Quando il codice sopra viene compilato ed eseguito, vedrai il seguente output. Ora puoi vedere che il valore del terzo elemento è aggiornato.
Copia array
Per copiare l'intero array in un altro oggetto CArray, è possibile utilizzare la funzione CArray :: Copy ().
Step1 - Creiamo un altro array e copiamo tutti gli elementi dal primo array come mostrato nel codice seguente.
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
}
Ora puoi vedere che abbiamo recuperato l'elemento dal 2 ° array e l'output è lo stesso perché abbiamo usato la funzione di copia.
Rimuovi elementi
Per rimuovere un elemento particolare, è possibile utilizzare la funzione CArray :: RemoveAt (). Per rimuovere tutti gli elementi dall'elenco, è possibile utilizzare la funzione CArray :: RemoveAll ().
Rimuoviamo il secondo elemento da un array.
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
}
Quando il codice sopra viene compilato ed eseguito, vedrai il seguente output. Ora puoi vedere che il nome Allan non fa più parte dell'array.