Учебники

MFC — CArray

CArray — это коллекция, которая лучше всего используется для данных, доступ к которым осуществляется случайным или не последовательным образом. Класс CArray поддерживает массивы, которые похожи на массивы C, но могут динамически уменьшаться и увеличиваться по мере необходимости.

  • Индексы массива всегда начинаются с позиции 0.

  • Вы можете решить, фиксировать ли верхнюю границу или разрешить расширение массива при добавлении элементов после текущей границы.

  • Память выделяется смежно с верхней границей, даже если некоторые элементы равны нулю.

Индексы массива всегда начинаются с позиции 0.

Вы можете решить, фиксировать ли верхнюю границу или разрешить расширение массива при добавлении элементов после текущей границы.

Память выделяется смежно с верхней границей, даже если некоторые элементы равны нулю.

добавлять

Добавляет элемент в конец массива; при необходимости увеличивает массив.

присоединять

Добавляет другой массив в массив; при необходимости увеличивает массив

копия

Копирует другой массив в массив; при необходимости увеличивает массив.

ElementAt

Возвращает временную ссылку на указатель элемента в массиве.

FreeExtra

Освобождает всю неиспользуемую память выше текущей верхней границы.

GetAt

Освобождает всю неиспользуемую память выше текущей верхней границы.

GetCount

Получает количество элементов в этом массиве.

Получить данные

Разрешает доступ к элементам в массиве. Может быть NULL .

GetSize

Получает количество элементов в этом массиве.

GetUpperBound

Возвращает самый большой действительный индекс.

InsertAt

Вставляет элемент (или все элементы в другом массиве) по указанному индексу.

Пустой

Определяет, является ли массив пустым.

Удалить все

Удаляет все элементы из этого массива.

RemoveAt

Удаляет элемент по определенному индексу.

Установлен на

Устанавливает значение для данного индекса; массив не может расти.

SetAtGrow

Устанавливает значение для данного индекса; при необходимости увеличивает массив.

SetSize

Устанавливает количество элементов, которые будут содержаться в этом массиве.

Ниже приведены различные операции над объектами 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 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Получить предметы

Добавить товары в середине

Чтобы добавить элемент в середину массива, вы можете использовать функцию 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
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод. Теперь вы можете увидеть имя Аллана Ддеда как второй индекс.

Добавить товары

Обновить значение элемента

Для обновления элемента в середине массива вы можете использовать функцию 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 ().

Шаг 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()) {
         pSysMenuAppendMenu(MF_SEPARATOR);
         pSysMenuAppendMenu(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
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод. Теперь вы можете видеть, что имя Аллан больше не является частью массива.