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 всех студентов возрастом <= 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 шт):
В руководстве 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, то тут без переопределения операторов сравнения точно не обойтись

