MFC - CArray



CArray 是一种集合,最适合用于以随机或非顺序方式访问的数据。CArray 类支持类似于 C 数组的数组,但可以根据需要动态缩小和增长。

  • 数组索引始终从位置 0 开始。

  • 您可以决定是修复上限还是在将元素添加到当前边界之外时允许数组扩展。

  • 即使某些元素为空,内存也会连续分配到上限。

以下是 CArray 对象的不同操作:

创建 CArray 对象

要创建 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() 函数。此函数将一个整数参数作为数组的索引。

步骤 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 - 当上述代码编译并执行时,您将看到以下输出。

Retrieve Items

在中间添加项目

要在数组中间添加项目,您可以使用 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 作为第二个索引添加的名称。

Add Items

更新项目值

要在数组中间更新项目,您可以使用 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
}

当上述代码编译并执行时,您将看到以下输出。您现在可以看到第三个元素的值已更新。

Update Items

复制数组

要将整个数组复制到另一个 CArray 对象,您可以使用 CArray::Copy() 函数。

步骤 1 - 让我们创建另一个数组并将第一个数组中的所有元素复制到其中,如下面的代码所示。

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
}

您现在可以看到我们已从第二个数组中检索了元素,并且输出相同,因为我们使用了复制函数。

Copy Array

删除项目

要删除任何特定项目,您可以使用 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 名称不再是数组的一部分。

Remove Items
广告