【发布时间】:2011-01-26 10:17:36
【问题描述】:
我正在研究 Accelerated C++ 中的示例。
其中一个问题要求读者将通过考试的学生的记录复制到一个称为学生的向量的开头。 fgrade 是在别处定义的返回失败学生的函数。
然后必须使用调整大小功能从学生中删除多余的元素,使其仅包含通过的人。
我已经尝试过这段代码,但它不起作用。谁能告诉我错误是否出在下面的代码中?
#include "stdafx.h"
#include <vector>
#include "Student_info.h"
#include "grade.h"
using std::vector;
// second try: correct but potentially slow
vector<Student_info> extract_fails(vector<Student_info>& students)
{
vector<Student_info> fail;
#ifdef _MSC_VER
std::vector<Student_info>::size_type i = 0;
std::vector<Student_info>::size_type count = 0;
#else
vector<Student_info>::size_type i = 0;
vector<Student_info>::size_type count = 0;
#endif
while (i != students.size()) {
if (!fgrade(students[i])) {
students.insert(students.begin(), students[i++]);
count++;
}
i++;
}
students.resize(count);
return students;
}
【问题讨论】:
-
循环中有两次 i++,因此您的代码将跳过所有奇怪的学生。如果 students.size() 不是偶数,则循环将永远进行。
-
在这种状态下,您将一个学生放入向量中,如果条件匹配,您将 same 学生插入向量中。所以你在向量中有两次......也许你需要使用'失败'向量......
-
在迭代时修改向量真的是个好主意吗?尤其是因为您使用索引来遍历每个学生,将通过的学生复制到向量的开头,所以您依靠那里复制的
i++来保存您的培根。如果是我,我会使用第二个向量。
标签: visual-c++