// second try: correct but potentially slow
vector<Student_info> extract_fails(vector<Student_info>& students)
{
vector<Student_info> fail;
vector<Student_info>::size_type i = 0;
// invariant:elements [0, i) of students represent passing grades
while (i != students.size())
{
if (fgrade(students[i]))
{
fail.push_back(students[i]};
students.erase(students.begin() + i);
} else
++i;
}
return fail;
}
上面的代码来自“Accelerated C ++”一书,它将计算用户标记。根据失败或通过成绩,结果将被放入fail
向量中,用于失败的学生。 students
是包含将传递
一切都很好,但是当我从
更改以下行时students.erase(students.begin() + i);
到
students.erase(i);
我收到以下编译错误:
错误:没有匹配函数来调用'std :: vector,std :: allocator&gt; :: erase(size_t&amp;)'
尽管我认为它们在功能上是一样的。任何人都可以解释是什么原因导致的吗?
答案 0 :(得分:1)
“没有匹配的呼叫功能”基本上都说明了一切。没有这样的擦除功能,它将“size_t”作为参数。这就是首先看似奇怪的students.erase(students.begin() + i);
的全部原因。
答案 1 :(得分:0)
你应该通过向量移动迭代器。所以你可以调用iterator = students.erase(it),它会给你正确的迭代器来继续没有问题。
像这样的东西
for( vector<Student_info>::itreator it; = students.begin(), it != students.end(); it++)
{
if(fgrade(*it))
{
fail.push_back(*it);
it = students.erase(it);
}
}