查找对象数组中最后使用的元素

时间:2012-04-29 02:46:58

标签: c++ arrays

我有一组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++;
        }

1 个答案:

答案 0 :(得分:3)

你遇到了更大的问题。您在函数matchedStudents中声明堆栈上的数组queryStudents。当控件传出该函数时,数组超出范围。如果你以后尝试使用它(通过它返回的指针,这是数组的第一个元素),那么你就会搞乱解除分配的内存,这几乎肯定会导致未定义的行为。这就好像你去过一个自从你上次出现以来已经改变了所有者的房子一样;没有人知道改变了什么,如果你闭着眼睛四处游荡,你可能会遇到麻烦。

您可以在堆上声明数组:

Student **Welcome::queryStudents(int *queries) {
  Student **matchedStudents = new *Student[100];
    ...
  return matchedStudents;
}

或者通过引用传递它:

void Welcome::queryStudents(int *queries, Student **&matchedStudents) {
    ...
}

无论哪种方式,您都可以解决如何指示有效指针结束的问题。您的方法看起来可行,但请记住,正如@JerryCoffin指出的那样,std::vector可用。数组是一种痛苦,STL容器(例如vector)是为了照顾这些肮脏的细节而制作的。这些天使用数组几乎没有任何目的,除了教学法;与他们一起玩,直到你理解了概念,然后使用更高级的容器,这些容器都是基于它们的。