首页 > 解决方案 > 有没有办法删除结构数组的一个元素?

问题描述

例如代码中所示。我得到了称为导师的结构,然后我初始化了代码导师讲师[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];

标签: c++struct

解决方案


无法从数组中删除元素。

唯一的可能是将所有后续元素向下移动一个索引。因此,应该在某处说明已使用元素的数量已减 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 现场演示


推荐阅读