使用size_type索引从std向量中删除会导致编译器错误?

时间:2011-12-06 08:20:21

标签: c++ iterator

// 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;)'

尽管我认为它们在功能上是一样的。任何人都可以解释是什么原因导致的吗?

2 个答案:

答案 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); } }