Есть ли способ удалить один элемент массива структуры? - PullRequest
1 голос
/ 03 апреля 2020

Например, как показано в коде. Я получил структуру под названием tutor, и после этого инициализирую лектор кода tutor [1000]; Есть ли способ удалить лектора [1], кроме того, чтобы вручную присвоить NULL каждому атрибуту в лекторе [1]? или есть какой-то код, который выглядит как этот "лектор [1] = NULL"? Спасибо, что нашли время прочитать и ответить.

Примечание: предположим, что я уже инициализировал и заполнил все атрибуты для лектора [0], лектора [1] и лектора [2].

struct tutor {

    int tutorID;
    string name;
    string date_Joined;
    string date_Terminated;
    double hourlyPayRate;
    string phone;
    string address;
    int center_Code;
    string center_Name;
    int subject_Code;
    string subject_Name;
    int rating;

};
.
.
.
tutor lecturer[1000];

1 Ответ

1 голос
/ 03 апреля 2020

Невозможно удалить элемент из массива.

Единственная возможность - переместить все последующие элементы на один индекс вниз. Таким образом, где-то следует отметить, что количество используемых элементов было уменьшено на 1, поскольку размер массива также нельзя изменить.

(Лучшая замена будет std::vector, конечно.)

Демонстрация того, как удалить элемент из массива:

#include <iostream>
#include <string>
struct tutor {
  int tutorID;
  std::string name;
};

std::ostream& operator<<(std::ostream &out, const tutor &entry)
{
  return out << "ID: " << entry.tutorID << ", name: " << entry.name;
}

int main()
{
  tutor lecturer[1000];
  size_t n = 0;
  // fill array
  lecturer[n++] = { 1, "Klaus" };
  lecturer[n++] = { 2, "Dieter" };
  lecturer[n++] = { 3, "Barbara" };
  lecturer[n++] = { 4, "Elisabeth" };
  // print array
  for (size_t i = 0; i < n; ++i) {
    std::cout << i << ": " << lecturer[i] << '\n';
  }
  // remove element 1 (He got COVID-19.)
  size_t j = 1;
  std::cout << "Remove " << j << ": " << lecturer[j] << '\n';
  for (size_t i = j + 1; i < n; ++i) {
    lecturer[i - 1] = lecturer[i];
  }
  --n; // remark that array has been shortened by 1
  // print array
  for (size_t i = 0; i < n; ++i) {
    std::cout << i << ": " << lecturer[i] << '\n';
  }
}

Вывод:

0: ID: 1, name: Klaus
1: ID: 2, name: Dieter
2: ID: 3, name: Barbara
3: ID: 4, name: Elisabeth
Remove 1: ID: 2, name: Dieter
0: ID: 1, name: Klaus
1: ID: 3, name: Barbara
2: ID: 4, name: Elisabeth

Демонстрация в реальном времени на coliru

Примечание:

Этот тип удаления имеет O (N) (наихудший случай).

Этого можно добиться быстрее, переместив последний элемент на место убранного. Это имеет O (1) (каждый случай), но может использоваться, только если порядок элементов не важен.

В этом случае удаление будет:

  // remove element 1 (He got COVID-19.)
  size_t j = 1;
  std::cout << "Remove " << j << ": " << lecturer[j] << '\n';
  lecturer[j] = lecturer[--n];

Вывод:

0: ID: 1, name: Klaus
1: ID: 2, name: Dieter
2: ID: 3, name: Barbara
3: ID: 4, name: Elisabeth
Remove 1: ID: 2, name: Dieter
0: ID: 1, name: Klaus
1: ID: 4, name: Elisabeth
2: ID: 3, name: Barbara

Живая демоверсия на coliru

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...