Вопрос C ++ относительно вставки элементов в векторы - PullRequest
0 голосов
/ 26 января 2011

Я работаю с примерами в Ускоренном C ++.Одна из проблем заключается в том, что читатель должен скопировать записи для студентов, которые сдают экзамены, в начало вектора, называемого студентами.fgrade - это функция, определенная в другом месте, которая возвращает учащихся с ошибками.Затем нужно использовать функцию изменения размера, чтобы удалить лишние элементы из учащихся, чтобы она содержала только тех, кто прошел.Я пробовал этот код, но он не работает.Может ли кто-нибудь сказать мне, если ошибка заключается в коде ниже?

#include "stdafx.h" 
#include <vector>
#include "Student_info.h"
#include "grade.h"

using std::vector;

// second try: correct but potentially slow
vector<Student_info> extract_fails(vector<Student_info>& students)
{
    vector<Student_info> fail;
#ifdef _MSC_VER
    std::vector<Student_info>::size_type i = 0;
    std::vector<Student_info>::size_type count = 0;
#else
    vector<Student_info>::size_type i = 0;
    vector<Student_info>::size_type count = 0;
#endif

    while (i != students.size()) { 
        if (!fgrade(students[i])) { 
            students.insert(students.begin(), students[i++]);
            count++;
        }
        i++; 
    }
    students.resize(count); 
    return students;
}

Ответы [ 3 ]

1 голос
/ 26 января 2011

Вы можете использовать remove_if из алгоритма std ::, но функтор должен возвращать людей, которые не прошли (f_not_grade), вместо людей, которые прошли:

std::remove_if(students.begin(), students.end(), f_not_grade)

Или вы можете посмотреть способ отрицания функтора здесь или здесь , чтобы использовать функцию f_grade без изменений и remove_if.

Большинство обычных операций с контейнерами реализованы в STL, поэтому используйте силу языка !. Поиск такого рода функций заставляет нас кодировать все меньше и меньше.

Отредактировано для удаления неправильной "()".

0 голосов
/ 26 января 2011

Как указали Space_C0wb0y и Artium, вы увеличили i в два раза.Кроме того, вы объявляете вектор неудачным, но никогда не используете его (если вы не сделаете что-то с ним позже).Кроме того, макрос в функции выглядит излишним - он в основном говорит одно и то же дважды (за исключением «std ::»), и вы могли бы просто использовать int - так, чтобы следующий человек мог читать и понимать.

0 голосов
/ 26 января 2011

Вы увеличиваете i в вашем цикле дважды.

Отличный способ сделать это - использовать пользовательский предикат для std::sort:

bool CompareStudentsByFailure(const Student_info & left, 
                              const Student_info & right) {
   return fgrade(left) > fgrade(right);
}

А затем используйте это так:

std::sort(students.begin(), students.end(), CompareStudentsByFailure);
students.resize(std::distance(students.begin(), 
                std::find_if(students.rbegin(), 
                             students.rend(), fpgrade).base()));

Однако, Ответ Джона немного проще.

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