merge(); STL vector

Во время выполнения merge выдаёт ошибку, подскажите как это исправить, в месте. При выполнении строки с merge оно почему-то лезет сюда, я не понимаю зачем

bool Student::operator<(Student& s)
{
    if (course < s.course) return true;
    else return false;
}

Скорее всего в этом и ошибка, но тупо снести эту часть кода я не могу

    vector<Student> VectorThree;
    merge(VectorOne.begin(), VectorOne.end(), VectorTwo.begin(), VectorTwo.end(), inserter(VectorThree, VectorThree.end()));
    PrnVector(VectorThree, "Слияние векторов VectorOne и VectorTwo в VectorThree: ");
int main()
{
    setlocale(0, "");
    //1) создать вектор Х
    vector<Student> VectorOne;

    //2) добавить в Х три новых элемента с определенными значениями
    AddElement(VectorOne, "Коля", 'm', 18, 3.5, 3);
    AddElement(VectorOne, "Андрей", 'm', 17, 4, 2);
    AddElement(VectorOne, "Маша", 'd', 16, 4, 1);

    //3) добавить в Х два новых элемента, значения которых вводятся с клавиатуры
    InputElement(VectorOne);
    InputElement(VectorOne);
    //4) вывести исходный вектор Х на экран
    PrnVector(VectorOne,"Инициализированный VectorOne: ");

    //5) создать вектор У, заполнить его сразу данными пяти студентов
    vector <Student> VectorTwo;
    FillVector(VectorTwo);

    //6) добавить в вектор У новый элемент с определенными значениями, вывести у на экран
    AddElement(VectorTwo, "Альбина", 'd', 16, 5, 1);
    PrnVector(VectorTwo, "Инициализированный VectorTwo: ");

    //7) удалить из У последний элемент, вывести У на экран
    DelElement(VectorTwo);
    PrnVector(VectorTwo, "Удалён последний элемент VectorTwo: ");

    //8) определить размеры контейнеров Х и У
    cout << "Размер VectorOne " << VectorOne.size();
    cout << "Размер VectorTwo " << VectorTwo.size();

    //9) разместить элементы контейнера Х в обратном порядке, вывести Х на экран
    reverse(VectorOne.begin(), VectorOne.end());
    PrnVector(VectorOne, "VectorOne в обратном порядке: ");

    //10) уменьшить рейтинг студентов вектора Х на 0.5, вывести Х на экран
    TransformRating(VectorOne);
    PrnVector(VectorOne, "Уменьшенный рейтинг (-0.5) VectorOne: ");

    //11) изменить в векторе У 1 курс на 4 курс
    transform(VectorTwo.begin(), VectorTwo.end(), VectorTwo.begin(), TransformCourse);
    PrnVector(VectorTwo, "Изменённый курс с 1 на 4 в VectorTwo: ");

    //12) переместить два первых элемента из вектора У в начало вектора Х, вывести Х на экран
    MoveElements(VectorOne, 0, VectorTwo, 0, 2);
    PrnVector(VectorOne, "Перемещённый 2 элемента в VectorOne: ");

    //13) слить вектора Х и У в новый вектор D, вывести на экран вектор D
    vector<Student> VectorThree;
    merge(VectorOne.begin(), VectorOne.end(), VectorTwo.begin(), VectorTwo.end(), inserter(VectorThree, VectorThree.end()));
    PrnVector(VectorThree, "Слияние векторов VectorOne и VectorTwo в VectorThree: ");

    //14) отсортировать вектор D по критерию пол, вывести на экран вектор D
    sort(VectorThree.begin(), VectorThree.end(), LessPol);
    PrnVector(VectorThree, "Отсортированный VectorThree по критерию пол: ");

    //15) создать новые вектора Z и P;
    vector<Student> VectorFour;
    vector<Student> VectorFive;

    //16) найти в векторе D всех студентов первого курса, записать результат в вектор Z, вывести Z на экран
    FindCourse(VectorThree, VectorFour, 1);
    PrnVector(VectorFour, "Все студенты 1 курса из VectorFour: ");

    //17) найти в векторе D всех студентов возрастом &lt;= 17 лет, записать результат в вектор Р
    FindAge obg = for_each(VectorFour.begin(), VectorFour.end(), FindAge(17));
    VectorFive = obg.detected();
    PrnVector(VectorFive, "Студенты <=17 лет");

    //18) записать вектор Р в файл, вычислить средний рейтинг студентов и также записать его в файл
    WriteFile(VectorFive);

    //19) продемонстрировать работу функции в соответствии с вариантом над вектором D, результат вывести на экран.
    //По исходной последовательности определить среднее значение рейтинга на заданном курсе
     FindCourse(VectorThree, VectorThree, 2);
     PrnVector(VectorThree, "Студенты 2 курса: ");
     cout << Average(VectorThree);
}

Ошибка1Ошибка2


Ответы (1 шт):

Автор решения: 4500zenja

В руководстве C++ про функцию merge() сказано следующее:

Merges two sorted ranges [first1, last1) and [first2, last2) into one sorted range beginning at d_first.

Это означает, что перед применением данной функции и контейнер-приёмник, и контейнер-передатчик должны быть отсортированы. У Вас же два вектора ранее не были отсортированы, поэтому функция, заточенная как раз под отсортированные функции, не понимает, как выполняться, и выбрасывает исключение.

Перед выполнением данной функции отсортируйте оба вектора (либо через встроенный sort(), либо своим способом):

std::sort(VectorOne.begin(), VectorOne.end());
std::sort(VectorTwo.begin(), VectorTwo.end());
vector<Student> VectorThree;
merge(VectorOne.begin(), VectorOne.end(), VectorTwo.begin(), VectorTwo.end(), inserter(VectorThree, VectorThree.end()));
PrnVector(VectorThree, "Слияние векторов VectorOne и VectorTwo в VectorThree: ");

UPD: раз уж в векторах содержатся объекты пользовательского класса Student, то тут без переопределения операторов сравнения точно не обойтись

→ Ссылка