Удаление из вектора std с индексом size_type приводит к ошибке компилятора? - PullRequest
0 голосов
/ 06 декабря 2011
// 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;
}

Приведенный выше код взят из книги «Ускоренный C ++» и рассчитывает пользовательские оценки.Исходя из неудовлетворительной или проходной оценки, результат помещается в вектор fail для учащихся, которые потерпели неудачу.students - это вектор, в котором содержится студент, который сдаст

Все хорошо, но когда я изменяю следующую строку с

students.erase(students.begin() + i);

на

students.erase(i);

Я получаю следующую ошибку компилятора:

ошибка: нет соответствующей функции для вызова 'std :: vector, std :: allocator> :: erase (size_t &)'

Хотя я думаю, что они функционально одинаковы.Кто-нибудь может объяснить, что вызывает это?

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

«Нет подходящей функции для вызова» в основном говорит само за себя. Нет такой функции стирания, которая принимает в качестве аргумента "size_t". И в этом вся причина, пожалуй, странного students.erase(students.begin() + i); во-первых.

0 голосов
/ 06 декабря 2011

Вы должны использовать итератор для перемещения по вектору.Таким образом, вы можете вызвать 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); } }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...