例如代码中所示。我得到了一个叫做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.
答案 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
注意:
这种清除方式具有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