| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Сортировка элементов вектора |
| Автор: m9yt 28.4.2010, 16:42 | ||
| Доброго времени суток! В общем, имеется вектор, содержащий указатели на объекты различных классов. В программе я создаю эти объекты и помещаю в коллекцию. После этого мне необходимо их отсортировать функцией set(). Вот:
После просмотра коллекции ничего не происходит.Все объекты выводятся в том же порядке. В чем ошибка?Может вектор должен сортироваться не по указателям на объекты, а по самим объктам? |
| Автор: Sartorius 28.4.2010, 16:45 |
| удалил |
| Автор: lexa107 28.4.2010, 16:48 |
| Когда сортируешь свои объекты таким образом, надо ещё добавлять функциональный класс, в котором описываешь как сравниваются два объекта |
| Автор: m9yt 28.4.2010, 16:51 |
| Можно небольшой примерчик функционального класса? В моих классах имеется: в 1-м поле string и int во 2-м 2 поля string и int Кстати, у нас в лабе ничего о функциональном классе не сказано. Написано только, что при создании своей функции сортировки необходимо использовать функцию сравнения. |
| Автор: azesmcar 28.4.2010, 16:55 | ||
пример |
| Автор: lexa107 28.4.2010, 17:00 | ||||
Честно сказать, я не пробовал сравнивать разные классы, но вообще функциональный класс сравнения выглядит так:
где MyClass - это класс, объекты которого сравниваются, str - строка в этом классе Теперь надо sort делать следующим образом:
обогнали( |
| Автор: m9yt 28.4.2010, 17:02 | ||||||||||
Н-дааа.пример конечно не очень наглядный.в его работе сложно разобраться. можно хотя бы эти std:: заменить? Добавлено через 1 минуту и 5 секунд
Твой пример мне намного понятней))) |
| Автор: lexa107 28.4.2010, 17:04 |
| пропиши в начале using namespace std; и не надо будет std:: писать |
| Автор: m9yt 28.4.2010, 17:10 |
| Тогда еще вопрос. Ведь у меня в классе не 1 поле.Если, например, в одном классе строка в первом поле больше, но в другом больше во втором поле, то как быть? И как сравнивать классы с вообще разным количеством полей? |
| Автор: lexa107 28.4.2010, 17:15 |
| Не обязательно писать return a < b; можно проделать сначала любые другие действия: например, если надо сравнить по именам и фамилиям, но они записаны в разных строках, можно сложить их в одну, и уже тогда сравнивать. Простор тут не ограничен Добавлено через 2 минуты и 29 секунд Чтобы сравнить два разных класса, можно попробовать перегрузить оператор скобок на разные входные данные. Пример нужен? |
| Автор: m9yt 28.4.2010, 17:20 | ||
Не помешает. |
| Автор: lexa107 28.4.2010, 17:26 | ||
Я, конечно, так никогда не делал, но по идее должно работать
Возращаемое значение конечно же нужно отредактировать под свои классы |
| Автор: m9yt 28.4.2010, 17:27 |
| А по какому полю сравнивать, зависит от меня? Нельзя как-то сравнивать сразу по всем полям? |
| Автор: lexa107 28.4.2010, 17:30 | ||||
Да, ты это сам можешь выбрать
Если ты сможешь при этом выбрать, какой объект больше, то можешь попробовать |
| Автор: m9yt 28.4.2010, 17:34 | ||
соответствнно, выдает ошибку error C2535: bool compare::operator ()(ID *,ID *): функция-член уже определена или объявлена ID*-указатель на абстрактный класс |
| Автор: lexa107 28.4.2010, 17:37 |
| Так это потому что ты при перегрузке функций передаёшь одни и те же параметры. Подожди, я сейчас попробую поправить твой код |
| Автор: m9yt 28.4.2010, 17:41 |
| Надо как-то сделать, чтобы различные параметры передавались... |
| Автор: lexa107 28.4.2010, 17:41 |
| У тебя address и Email - это наследники одного класса ID. Так? Где ты задаёшь поле id? |
| Автор: m9yt 28.4.2010, 17:41 | ||||||||||||
Опередил) Добавлено через 5 минут и 50 секунд
address наследник ID, а Email наследник address. поле id задаю
|
| Автор: lexa107 28.4.2010, 17:49 | ||
Попробуй просто написать:
|
| Автор: m9yt 28.4.2010, 17:52 | ||
может так?
|
| Автор: lexa107 28.4.2010, 17:54 | ||||
Может и так прокатит |
| Автор: m9yt 28.4.2010, 18:02 | ||||||
Не катит...(( error C2664: bool compare::operator ()(address *,address *): невозможно преобразовать параметр 1 из 'ID *' в 'address *' |
| Автор: lexa107 28.4.2010, 18:04 |
| Мой способ тоже никак? |
| Автор: m9yt 28.4.2010, 18:12 | ||||
Вот это прокатило!))) Сейчас объект сортируются по id в порядке возрастания, независимо от типа класса! Думаю, мы добились нужного? |
| Автор: lexa107 28.4.2010, 18:15 |
| Тебе видней, добились или нет |
| Автор: m9yt 28.4.2010, 18:18 | ||
Спасибо тебе. У меня впереди сортировка слиянием.Если что, напишу в личку) |
| Автор: lexa107 28.4.2010, 18:27 |
| удалил |