c++ - 在对象数组中查找最后使用的元素

标签 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++;
        }

最佳答案

你有一个更大的问题。您在函数 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/

相关文章:

c++ - 尝试将 Lua 嵌入到 C++ 中, "undefined reference to ' dlopen'”

c++ - 调用不通过空指针访问成员的非静态方法是否合法/定义明确的 C++?

c++ - strcpy断言错误c++

javascript - 将 GET 更新数据对象数组中的所有值乘以单个值

c++ - 链接动态和静态库 Rcpp

c++构造函数不工作

arrays - Swift - 合并两个数组,同时删除重复的键并将数组值添加在一起

php - 如何从 PHP 数组中删除所有重复项?

javascript - Node.js 中的 Array.forEach 是异步的吗?

c - 如何在 C 中将随机大写字母数组填充为函数?