CArray là một bộ sưu tập được sử dụng tốt nhất cho dữ liệu được truy cập theo cách ngẫu nhiên hoặc không tuần tự. Lớp CArray hỗ trợ các mảng giống như mảng C, nhưng có thể tự động thu nhỏ và phát triển khi cần thiết.
- Chỉ mục mảng luôn bắt đầu ở vị trí 0.
- Bạn có thể quyết định sửa giới hạn trên hay cho phép mở rộng mảng khi bạn thêm các phần tử vượt qua giới hạn hiện tại.
- Bộ nhớ được phân bổ liền kề với giới hạn trên, ngay cả khi một số phần tử là null.
Dưới đây là danh sách các phương thức của lớp CArray.
Sau đây là các thao tác khác nhau trên các đối tượng CArray –
Tạo đối tượng CArray
Để tạo một bộ sưu tập các giá trị hoặc đối tượng CArray, trước tiên bạn phải quyết định loại giá trị của bộ sưu tập. Bạn có thể sử dụng một trong các kiểu dữ liệu nguyên thủy hiện có như int, CString, double, v.v. như hình bên dưới;
CArray<CString, CString>strArray;
Thêm các mục
Để thêm một mục, bạn có thể sử dụng hàm CArray::Add(). Nó thêm một mục vào cuối mảng. Trong OnInitDialog(), đối tượng CArray được tạo và ba tên được thêm vào như minh họa trong đoạn mã sau.
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
Lấy vật phẩm
Để truy xuất bất kỳ mục nào, bạn có thể sử dụng hàm CArray::GetAt(). Hàm này lấy một tham số nguyên làm chỉ mục của mảng.
Bước 1 – Chúng ta hãy xem một ví dụ đơn giản, ví dụ này sẽ truy xuất tất cả các tên.
//Retrive names from CArray
for (int i = 0; i < strArray.GetSize(); i++) {
m_strText.Append(strArray.GetAt(i) + L"\n");
}
Bước 2 – Đây là triển khai hoàn chỉnh của 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
}
Bước 3 – Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy đầu ra sau.
Thêm các mục ở giữa
Để thêm mục vào giữa mảng, bạn có thể sử dụng hàm CArray::.InsertAt(). Phải mất hai tham số – Thứ nhất, chỉ mục và Thứ hai, giá trị.
Hãy để chúng tôi chèn một mục mới vào chỉ mục 1 như trong đoạn mã sau.
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
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy đầu ra sau. Bây giờ bạn có thể thấy tên Allan được thêm vào làm chỉ mục thứ hai.
Cập nhật giá trị mặt hàng
Để cập nhật mục ở giữa mảng, bạn có thể sử dụng hàm CArray::.SetAt(). Phải mất hai tham số – Thứ nhất, chỉ mục và Thứ hai, giá trị.
Hãy để chúng tôi cập nhật phần tử thứ ba trong mảng như trong đoạn mã sau.
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
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy đầu ra sau. Bây giờ bạn có thể thấy rằng giá trị của phần tử thứ ba đã được cập nhật.
Sao chép mảng
Để sao chép toàn bộ mảng vào một đối tượng CArray khác, bạn có thể sử dụng hàm CArray::Copy().
Bước 1 – Hãy để chúng tôi tạo một mảng khác và sao chép tất cả các phần tử từ mảng đầu tiên như trong đoạn mã sau.
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
}
Bây giờ bạn có thể thấy rằng chúng tôi đã truy xuất phần tử từ mảng thứ 2 và đầu ra giống nhau vì chúng tôi đã sử dụng chức năng sao chép.
Xóa mục
Để xóa bất kỳ mục cụ thể nào, bạn có thể sử dụng hàm CArray::RemoveAt(). Để xóa tất cả phần tử khỏi danh sách, có thể sử dụng hàm CArray::RemoveAll().
Hãy để chúng tôi xóa phần tử thứ hai khỏi một mảng.
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
}
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy đầu ra sau. Bây giờ bạn có thể thấy rằng tên Allan không còn là một phần của mảng nữa.