我有一组 Student
对象。我将数组长度设置为 100,但其中没有 100 个有效的 Student
对象。我希望能够遍历数组并获取所有有效的 Student
对象,然后在到达没有 Student 对象的数组单元格时停止。
我尝试将 NULL
放入最后一个学生之后的数组单元格中,然后检查 if (queriedStudents[i])
以及 if(queriedStudents [i] != NULL)
,但两者都不适合我。
找到数组已用部分末尾的最佳方法是什么?
Student *Welcome::queryStudents(int *queries) {
int query = 0;
Student *matchedStudents[100];
int matchedPos = 0;
while (queries[query] > 0) {
for (int i = 0; i < numStudents; i++) {
if (allStudents[i]->id == queries[query]) {
matchedStudents[matchedPos] = allStudents[i];
matchedPos++;
}
}
query++;
}
matchedStudents[matchedPos] = NULL;
return *matchedStudents;
}
我的代码块试图打印出每个 Student
的值:
int i = 0;
while (i < 100) {
if (queriedStudents[i]) {
cout << "ID:\t" << queriedStudents[i]->id << endl;
cout << "Name:\t" << queriedStudents[i]->name << endl;
cout << "Addr.:\t" << queriedStudents[i]->address << endl;
cout << "Phone:\t" << queriedStudents[i]->phone << endl;
} else {
i = 100;
}
i++;
}
最佳答案
你有一个更大的问题。您在函数 queryStudents
中声明堆栈上的数组 matchedStudents
。当控制传出该函数时,数组就会传出作用域。如果您稍后尝试使用它(通过它返回的指针,它是数组的第一个元素),那么您就会弄乱释放的内存,这几乎肯定会导致未定义的行为。就好像您正在参观一座自您上次到访后易主的房子;不知道发生了什么变化,如果你闭着眼睛四处游荡,你可能会遇到麻烦。
可以在堆上声明数组:
Student **Welcome::queryStudents(int *queries) {
Student **matchedStudents = new *Student[100];
...
return matchedStudents;
}
或者通过引用传入:
void Welcome::queryStudents(int *queries, Student **&matchedStudents) {
...
}
无论哪种方式,您都可以解决如何指示有效指针结束的问题。您的方法看起来可行,但请记住,正如@JerryCoffin 指出的那样,std::vector
可用。数组很麻烦,STL 容器(例如 vector
)就是为您处理这些肮脏的细节而设计的。如今,除了教学之外,使用数组几乎毫无用处。与它们一起玩,直到您理解这些概念,然后使用基于它们的更高级的容器。
关于c++ - 在对象数组中查找最后使用的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369296/