C++ 有没有办法删除结构数组中的一个元素?
例如,如代码中所示。我得到了名为tutor的结构,然后初始化代码tutor讲师[1000];除了手动为讲师[1]中的every属性指定NULL外,还有什么方法可以删除讲师[1]吗?或者是否有类似于“讲师[1]=NULL”的代码?感谢您抽出时间阅读和回答 注意:假设我已经初始化并填充讲师[0]、讲师[1]和讲师[2]的所有属性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
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.Rankinmemmove()
与类一起使用……这会让我害怕。:-)嗯,数组就是数组——所以——你觉得幸运吗?:)
(我想我应该限定一下——一个普通的旧数组就是普通的OId数组——不是std::数组
)@Scheff谢谢你,我很好地实现了这个想法,它工作得很好。很遗憾,我不能尝试std::vector,但我会在不同的程序中尝试学习它。:)