MFC - CArray
CArraylà một tập hợ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 từ vị trí 0.
Bạn có thể quyết định sửa giới hạn trên hoặc cho phép mảng mở rộ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 cấp phát liên tục cho giới hạn trên, ngay cả khi một số phần tử là rỗng.
Sr.No. | Tên & Mô tả |
---|---|
1 | Add Thêm một phần tử vào cuối mảng; phát triển mảng nếu cần thiết. |
2 | Append Thêm mảng khác vào mảng; phát triển mảng nếu cần thiết |
3 | Copy Sao chép mảng khác vào mảng; phát triển mảng nếu cần thiết. |
4 | ElementAt Trả về một tham chiếu tạm thời đến con trỏ phần tử trong mảng. |
5 | FreeExtra Giải phóng tất cả bộ nhớ không sử dụng trên giới hạn trên hiện tại. |
6 | GetAt Giải phóng tất cả bộ nhớ không sử dụng trên giới hạn trên hiện tại. |
7 | GetCount Nhận số phần tử trong mảng này. |
số 8 | GetData Cho phép truy cập vào các phần tử trong mảng. Có thểNULL. |
9 | GetSize Nhận số phần tử trong mảng này. |
10 | GetUpperBound Trả về chỉ mục hợp lệ lớn nhất. |
11 | InsertAt Chèn một phần tử (hoặc tất cả các phần tử trong một mảng khác) tại một chỉ mục được chỉ định. |
12 | IsEmpty Xác định xem mảng có trống không. |
13 | RemoveAll Xóa tất cả các phần tử khỏi mảng này. |
14 | RemoveAt Loại bỏ một phần tử tại một chỉ mục cụ thể. |
15 | SetAt Đặt giá trị cho một chỉ mục nhất định; mảng không được phép phát triển. |
16 | SetAtGrow Đặt giá trị cho một chỉ mục nhất định; phát triển mảng nếu cần thiết. |
17 | SetSize Đặt số phần tử được chứa trong mảng này. |
Sau đây là các hoạt động khác nhau trên các đối tượng CArray:
Tạo đối tượng CArray
Để tạo tập hợ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 tập hợ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 dưới đây;
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 đối tượng OnInitDialog (), CArray được tạo và ba tên được thêm vào như thể hiện 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 các mục
Để lấy bất kỳ mục nào, bạn có thể sử dụng hàm CArray :: GetAt (). Hàm này nhận một tham số số nguyên làm chỉ số của mảng.
Step 1 - Chúng ta hãy xem một ví dụ đơn giản, sẽ lấy ra 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");
}
Step 2 - Đây là quá trình triển khai đầy đủ 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
}
Step 3 - Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ thấy kết quả như 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 (). Nó cần hai tham số - Thứ nhất, chỉ số và Thứ hai, giá trị.
Hãy để chúng tôi chèn một mục mới tại chỉ mục 1 như được hiển thị 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 kết quả sau. Bây giờ bạn có thể thấy tên Allan được đặt 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 (). Nó cần hai tham số - Thứ nhất, chỉ số và Thứ hai, giá trị.
Hãy để chúng tôi cập nhật phần tử thứ ba trong mảng như được hiển thị 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 kết quả 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 ().
Step1 - Hãy 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ư được hiển thị 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à kết quả giống nhau vì chúng tôi đã sử dụng hàm sao chép.
Xóa các mục
Để loại bỏ 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 kết quả 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.