C++ 有没有办法删除结构数组中的一个元素?

C++ 有没有办法删除结构数组中的一个元素?,c++,struct,C++,Struct,例如,如代码中所示。我得到了名为tutor的结构,然后初始化代码tutor讲师[1000];除了手动为讲师[1]中的every属性指定NULL外,还有什么方法可以删除讲师[1]吗?或者是否有类似于“讲师[1]=NULL”的代码?感谢您抽出时间阅读和回答 注意:假设我已经初始化并填充讲师[0]、讲师[1]和讲师[2]的所有属性 struct tutor { int tutorID; string name; string date_Joined; string d

例如,如代码中所示。我得到了名为tutor的结构,然后初始化代码tutor讲师[1000];除了手动为讲师[1]中的every属性指定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

(当然,一个更好的替代者应该是一个

演示如何从阵列中删除元素:

#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';
  }
}

注意:

这种移除具有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];

您可以为可接受的元素指定默认的
导师。您也可以直接就地调用它的析构函数,但这通常是一个不好的想法,因为
std::vector
比数组更可取。它具有大小管理(也称为已使用元素)和删除内置元素…@Scheff您的意思是,它是通过用讲师[2]属性覆盖讲师[1]属性来实现的,因此讲师[1]中的属性自然会丢失吗?并将讲师[2]归因于讲师[3]等等?是的。这就是
std::vector
在内部所做的(粗略地说)。;-)我的讲师要求我使用数组:((除了循环之外,唯一可能的方法是使用
memmove
将其余元素向下移动一个。同意,
std::vector
(或其他容器)将是一个更好的解决方案。@DavidC.Rankin
memmove()
与类一起使用……这会让我害怕。:-)嗯,数组就是数组——所以——你觉得幸运吗?
:)
(我想我应该限定一下——一个普通的旧数组就是普通的OId数组——不是
std::数组
)@Scheff谢谢你,我很好地实现了这个想法,它工作得很好。很遗憾,我不能尝试std::vector,但我会在不同的程序中尝试学习它。:)