从带有size_type索引的std vector中删除将导致编译器错误

Erasing from std vector with size_type index results in compiler error?

本文关键字:删除 错误 编译器 vector std size type 索引      更新时间:2023-10-16
// 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>::erase(size_t&)'没有匹配的函数

尽管我认为它们在功能上是一样的。有人能解释一下是什么原因吗?

"no matching function for call"基本上说明了一切。没有这种以"size_t"作为参数的擦除函数。这就是为什么会出现看似奇怪的students.erase(students.begin() + i);的全部原因。

应该使用迭代器遍历vector对象。所以你可以调用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); } }