Возникли проблемы с перебором вектора в C ++ - PullRequest
0 голосов
/ 05 марта 2020

Я пытался закодировать программу, в которую я вводил данные для класса ученика (с помощью (const string & first_name, const string & last_name, float gpa, int id), который может отображать, какие учащиеся имеют gpa выше 1,00. возникли проблемы при переборе по вектору. Вот функция, вызывающая у меня проблемы:

vector<Student> find_failing_students(vector<Student> &students) {
    vector<Student> failing_students;
    int endVar;
    vector<Student>::iterator it;
    std::vector<Student>::iterator &forwardmarch = &students.begin();

    while(forwardmarch != &students.end())
    {
        Student temp = Student(forwardmarch->first_, forwardmarch->last_, forwardmarch->gpa_, forwardmarch->id_);
        if(temp.getgpa(temp) < 1) {
                    failing_students.push_back(temp);
        forwardmarch++;
    }

часть std::vector<Student>::iterator &forwardmarch = &students.begin(); выдает мне следующую ошибку: неверная инициализация неконстантной ссылки типа 'std :: vector :: iterator & '{aka' __gnu_cxx :: __ normal_iterator> & '} из значения типа' std :: vector :: iterator * '{aka' __gnu_cxx :: __ normal_iterator> * '}

в то время как l oop while(forwardmarch != &students.end()) также выдает мне следующую ошибку: нет соответствия для оператора! = (Типы операндов 'std :: vector :: iterator' {aka '__gnu_cxx :: __ normal_iterator>'} и 'std :: vector :: iterator * '{aka' __gnu_cxx :: __ normal_iterator> * '})

Я пробовал много вещей, а также пытался использовать более типичный для l oop, такой как

for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
    it->doSomething();
 }

Я немного сбит с толку и довольно плохо знаком с C ++. elp будет оценен. Спасибо!

1 Ответ

6 голосов
/ 05 марта 2020

Эта строка не имеет смысла:

std::vector<Student>::iterator &forwardmarch = &students.begin();

С левой стороны амперсанд сообщает, что вы объявляете ссылку на объект (а не на объект). На правой стороне амперсанд говорит получить указатель на объект, а не на сам объект. Правильное использование - объявить новый объект и назначить его напрямую:

std::vector<Student>::iterator forwardmarch = students.begin();

Это очень фундаментальный материал. Чтение topi c будет указателями и ссылками на C ++.

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