MFC - CArray
CArrayเป็นคอลเล็กชันที่ใช้ดีที่สุดสำหรับข้อมูลที่จะเข้าถึงในลักษณะสุ่มหรือไม่เรียงตามลำดับ คลาส CArray รองรับอาร์เรย์ที่เหมือนกับอาร์เรย์ C แต่สามารถย่อขนาดและขยายแบบไดนามิกได้ตามความจำเป็น
ดัชนีอาร์เรย์เริ่มต้นที่ตำแหน่ง 0 เสมอ
คุณสามารถตัดสินใจได้ว่าจะแก้ไขขอบเขตบนหรือเปิดใช้งานอาร์เรย์เพื่อขยายเมื่อคุณเพิ่มองค์ประกอบเลยขอบเขตปัจจุบัน
หน่วยความจำถูกจัดสรรอย่างต่อเนื่องกับขอบเขตบนแม้ว่าองค์ประกอบบางอย่างจะเป็นโมฆะก็ตาม
ซีเนียร์ | ชื่อและคำอธิบาย |
---|---|
1 | Add เพิ่มองค์ประกอบที่ส่วนท้ายของอาร์เรย์ ขยายอาร์เรย์หากจำเป็น |
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 Object
ในการสร้างคอลเลกชันของค่าหรือวัตถุ CArray ก่อนอื่นคุณต้องตัดสินใจเลือกประเภทของค่าของคอลเล็กชัน คุณสามารถใช้ประเภทข้อมูลดั้งเดิมที่มีอยู่เช่น int, CString, double เป็นต้นดังที่แสดงด้านล่าง
CArray<CString, CString>strArray;
เพิ่มรายการ
ในการเพิ่มรายการคุณสามารถใช้ฟังก์ชัน CArray :: Add () เพิ่มรายการที่ส่วนท้ายของอาร์เรย์ ใน OnInitDialog () อ็อบเจ็กต์ CArray จะถูกสร้างขึ้นและมีการเพิ่มชื่อสามชื่อดังที่แสดงในโค้ดต่อไปนี้
CArray<CString, CString>strArray;
//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");
ดึงรายการ
ในการดึงข้อมูลรายการใด ๆ คุณสามารถใช้ฟังก์ชัน CArray :: GetAt () ฟังก์ชันนี้รับพารามิเตอร์จำนวนเต็มหนึ่งพารามิเตอร์เป็นดัชนีของอาร์เรย์
Step 1 - ให้เราดูตัวอย่างง่ายๆซึ่งจะดึงชื่อทั้งหมด
//Retrive names from CArray
for (int i = 0; i < strArray.GetSize(); i++) {
m_strText.Append(strArray.GetAt(i) + L"\n");
}
Step 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
}
Step 3 - เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้
เพิ่มรายการที่อยู่ตรงกลาง
ในการเพิ่มรายการที่อยู่ตรงกลางอาร์เรย์คุณสามารถใช้ฟังก์ชัน CArray ::. InsertAt () ต้องใช้พารามิเตอร์สองตัว - ตัวแรกดัชนีและตัวที่สองคือค่า
ให้เราแทรกรายการใหม่ที่ดัชนี 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
}
เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้ ตอนนี้คุณสามารถเห็นชื่อ Allan ที่ระบุเป็นดัชนีที่สอง
อัปเดตมูลค่ารายการ
หากต้องการอัปเดตรายการที่อยู่ตรงกลางอาร์เรย์คุณสามารถใช้ฟังก์ชัน CArray ::. SetAt () ต้องใช้พารามิเตอร์สองตัว - ตัวแรกดัชนีและตัวที่สองคือค่า
ให้เราอัปเดตองค์ประกอบที่สามในอาร์เรย์ดังที่แสดงในรหัสต่อไปนี้
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
}
เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้ ตอนนี้คุณจะเห็นว่ามีการอัปเดตค่าขององค์ประกอบที่สาม
คัดลอกอาร์เรย์
หากต้องการคัดลอกอาร์เรย์ทั้งหมดไปยังวัตถุ 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 ครั้งที่หลากหลายและการส่งออกจะเหมือนกันเพราะเราได้ใช้ฟังก์ชั่นการคัดลอก
ลบรายการ
หากต้องการลบรายการใด ๆ คุณสามารถใช้ฟังก์ชัน CArray :: RemoveAt () ในการลบองค์ประกอบทั้งหมดออกจากรายการสามารถใช้ฟังก์ชัน CArray :: RemoveAll () ได้
ให้เราลบองค์ประกอบที่สองออกจากอาร์เรย์
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 ไม่ได้เป็นส่วนหนึ่งของอาร์เรย์อีกต่อไป