有什么办法可以删除结构数组中的一个元素?

时间:2020-04-03 06:48:15

标签: c++ struct

例如代码中所示。我得到了一个叫做tutor的结构,然后初始化了代码tutor讲师[1000];除了手动将NULL分配给讲师[1]中的每个属性外,还有什么方法可以删除?还是有一些看起来像这样的代码“ lecturer [1] = NULL”?感谢您花费时间阅读和回答。

注意:假设我已经初始化并填写了讲师[0],讲师[1]和讲师[2]的所有属性。

java.lang.IllegalStateException: Trying to set the device owner, but device owner is already set.

1 个答案:

答案 0 :(得分:1)

无法从数组中删除元素。

唯一的可能性是将所有以下元素向下移动一个索引。 因此,应该在某处注明已使用的元素数已减少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

Live Demo on 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

Live Demo on coliru