![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| AlexanderV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 31.8.2005 Где: Украина, Киев Репутация: нет Всего: нет |
Нужно отсортировать STL-список (list), содержащий указатели на пользовательския структуры.
Стандартный алгоритм sort не работает для списка (для vector(массива) - отлично работает). Остаеться стандартный алгоритм sort в классе list. Он не поддерживает перегрузки функторов, и поэтому единственный возможный способ - это перегрузить оператор сравнения ">". Но он не перегружается! Из-за того, что надо сравнить не структуры, а указатели на них. Стандартное сравнивание указателей, понятно, не приводит к правильной сортировке списка.
результат: not sorted: 4 8 9 2 sorted: 8 9 2 4 Если это никак нельзя правильно заставить работать, какой вообще толк от STL? Буду рад любому варианту решения проблемы. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Vyacheslav, обращаю внимание на это:
Не все версии STL поддерживают list::sort с предикатами. А ты как раз дал решение с пользовательским предикатом. AlexanderV, если твоя STL точно не поддерживает list::sort с пользовательским предикатом, то просто скопируй свои указатели во временный вектор, отсортируй и скопируй обратно (всего-то 2 лишних строчки):
-------------------- ... |
|||
|
||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Угу. Тогда откуда у него в коде sort c использованием темплейтного функтора?
Ну в конце концов у него и специализация не поддерживается? Например, так
Или воспользоваться наследованием
Вообще я лично не понял, что такое "Он не поддерживает перегрузки функторов". Если принять наиболее распространненое понятие, предполагающее что функторы - это только классы с перегруженным оператором(), то причем здесь тогда "перегрузка функторов"? -------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
А фиг его знает... просмотрела, честно говоря...
Ну, работала я как-то с версией STL, которая имеет только функцию list::sort() без параметров, подразумевающую сортировку с оператором <. Я так это и поняла. Ну, в общем, всегда можно выкрутиться. -------------------- ... |
||||
|
|||||
| AlexanderV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 31.8.2005 Где: Украина, Киев Репутация: нет Всего: нет |
Похоже, мой компилятор окончательно устарел
Я пробовал и создавать новые функторы, производные от greater - ни хрена не работает. Используеться стандартный оператор (), что вызывает ошибку. Копирование в временный вектор решает проблему, но слишком грубо. Программа критична к скорости выполнения. А где можно скачать последнюю версию STL (если можно вообще)? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
быть может пытался использовать но не получилось -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
||||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
какой компилятор? в g++ 4.0.2 такое прокатывает -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| AlexanderV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 31.8.2005 Где: Украина, Киев Репутация: нет Всего: нет |
MSVC++6
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Лучше использовать stl_port. А может, компилятор пора сменить?
Кстати, копирование по сравнению с сортировкой добавит тебе всего ~2N. В том смысле, что время выполнения так и останется ~ NlogN. Не стоит париться с оптимизацией, пока не убедишься, что проблемы действительно есть (причем с помощью профилитора). Кроме того, встает вопрос: если тебе нужен сортированный список, то список ли тебе нужен? Подходящий выбор контейнера тоже может поспособствовать быстродействию. -------------------- ... |
|||
|
||||
| AlexanderV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 31.8.2005 Где: Украина, Киев Репутация: нет Всего: нет |
Если так уже говорить, то STL - вообще медленная часть программы. Самое эффективное - это использование обычных массивов и структур.
А какую версию STL качать, чтоб она была совместима с MSVC++ 6.0? |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Не уверен, что самая медленная. Быстрее, думаю, не сделаешь. Разве что на ассемблере с учетом оптимизации размещения кода под P4 и использования SSE инструкций, может что и ускоришь. Но оно тебе надо?!?
Добавлено @ 22:15 Я думаю, STL 3.3 подойдет. Там написаны специальные версии для VC 4.2, а про VC 6 ничего не написано. |
|||
|
||||
| AlexanderV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 31.8.2005 Где: Украина, Киев Репутация: нет Всего: нет |
Скачал STL 3.3 как только пробую компилировать - сплошные ошибки в файлах iostream и им подобных. В общем, полная ж***! Уже блин не знаю что и делать! Хоть новый диск Visual Studio покупать!
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
AlexanderV, чтобы сконфигурировать STL стороннего разработчика под 6ю студию нужно наверняка покопаться в заголовках. Там должно быть какое-то описание.
Но лучше переходи на 7ю студию - там STL вполне приличная, да и сам компилятор тоже гораздо лучше. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |