我正在研究Accelerated C ++中的示例。
其中一个问题是要求读者将通过考试的学生的记录复制到名为学生的矢量开头。 fgrade
是在别处定义的函数,它返回失败的学生。
然后必须使用resize函数从学生中删除多余的元素,因此它只包含那些通过的元素。
我尝试过这段代码,但它不起作用。谁能告诉我,如果错误在于下面的代码?
#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;
}
答案 0 :(得分:1)
您可以使用std :: algorithm中的remove_if,但是仿函数应该返回没有通过的人(f_not_grade)而不是通过的人:
std::remove_if(students.begin(), students.end(), f_not_grade)
或者你可以通过否定一个仿函数here或here来使用f_grade函数而不进行修改和remove_if。
大多数带容器的常见操作都是在STL中实现的,所以要使用语言的强大功能!花一点时间寻找这种功能使我们能够编写更少,更好的代码。
编辑删除不正确的“()”。
答案 1 :(得分:0)
你在循环中增加i
两次。
一种很酷的方法是使用std::sort
的自定义谓词:
bool CompareStudentsByFailure(const Student_info & left,
const Student_info & right) {
return fgrade(left) > fgrade(right);
}
然后像这样使用它:
std::sort(students.begin(), students.end(), CompareStudentsByFailure);
students.resize(std::distance(students.begin(),
std::find_if(students.rbegin(),
students.rend(), fpgrade).base()));
然而,Jon`s answer稍微简单一些。
答案 2 :(得分:0)
正如Space_C0wb0y和Artium指出的那样,你增加了两次。此外,您声明向量失败,但从不使用它(除非您稍后使用它做某事)。另外,函数中的宏似乎有点矫枉过正 - 它基本上说两次相同的东西(减去“std ::”),你也可以只使用整数 - 更容易让下一个人阅读和理解。 / p>