![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Есть необходимость хранить объекты в ассоциативном списке - так и поиск получается быстрее, и объекты хранятся "парами", что позволяет много чего реализовать. Стандартный набор контейнерных классов MFC предоставляет класс CMap и производные для реализации такого списка (карты).
Проблема состоит в том, что УДАЛЯТЬ объекты из ассоциативного списка можно только пользуясь RemoveKey(TYPE key), что накладывает ряд ограничений. В частности, если в списке НЕСКОЛЬКО объектов с одинаковым ключом, то RemoveKey удаляет "первый" из них, кавычки - потому что невозможно заранее определить, какая из пар будет первой в списке (пары постоянно "тусуются" функцией HashKey). Таким образом, получаем "половинчатую" функциональность в качестве списка - можно проходить по списку последовательно - "GetNextAssoc(POSITION pos, TYPE1 key, TYPE2 value)", но нельзя удалить объект из списка с пом. той-же POSITION. Но не все так грустно. Вот пример того, как можно реализовать удаление объекта из CMapPtrToPtr, пользуясь значением POSITION (как в обычном списке CPtrList). Сразу скажу, что пример не претендует на звание самого лучшего, бОльшая часть - просто переписанный исходник "/VC98/MFC/SRC/Map_PP.cpp". Если кто-то знает, как реализовать быстрее - плз, пишите сюда или на [email protected] map2_pp.h
map2_pp.cpp
Еще раз повторюсь, это лишь то, что можно сделать пользуясь исходником MFC (грубо, коряво, но работает). Плз, если кто-то знает, киньте пример как сделать по-другому ! Thanks -------------------- ![]() |
||||
|
|||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Кстати.
На самом деле очень удобно юзать карты. Для сравнения:
Не забывать только чистить поинтеры вручную, а то деструктор этого не делает. Это сообщение отредактировал(а) mr.DUDA - 28.7.2003, 14:04 -------------------- ![]() |
|||
|
||||
| TaTaP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 15.10.2002 Репутация: 1 Всего: 1 |
А использование классов MFC - это принципиально или просто по привычке? IMHO лучший выбор для такого рода задач - STL. Хоть и посложнее, чем MFC, но зато раз изучив, снимаешь с себя огромные проблемы в будущем. Стандартный ассоциативный контейнер в STL - map.
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Да, используй STL и забей на контейнеры MFC - тебе от этого только легче жить будет
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Почитал я тут MSDN про STL, муть какая-то (уж простите).
Чем он так хорош - быстрее, что ли ? IMHO, с контейнерами MFC можно делать все то же самое (кроме некоторых особо вредных случаев - как с приведенным примером CMap). Народ, если я неправ, покажите мне чем STL лучше. -------------------- ![]() |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Я попробую, но от тебя потребуется по меньшей мере умение пользоваться шаблонами.
И так STL: 1. Уже реализованно множество задач по хранению, поиску и т.п. любой информации, которую можно описать средствами языка. 2. Вся библиотека построена на шаблонах - код более быстрый и в твоей программе компилятор использует только нужные участки кода. Кроме того, STL имеет модульную структуру и подключаются только необходимые модули. 3. Библиотека сама заботиться о резервировании и освобождении памяти под хранимые данные. 4. Все алгоритмы за последнии десятилетия были составлены и отлажены лучшими специалистами, поэтому, если рассматривать проблему в общем, то быстрее и лучше чем это уже сделано ты врядли напишешь. Т.е. твоя программа может выполнять ряд задач с большой скоростью если она использует STL. 5. Библиотека платформенно независима, значит ты можешь не зависеть (относительно конечно) от причуд МС или Борланд и компилировать (естественно грамотно составленный код) на различных системах. Пример из жизни: я писал приложение OpenGL. Исходная информация о моделях импортировалась из файлов ~ 20Mb. При использовании MFC импорт занимал до 30 минут на каждый файл. Когда я воспользовался STL в том же алгоритме чтения файла, то время сократилось до 10-15 минут. Кроме того, MFC из 7 студии не полностью совместимо с кодом MFC из 6 студии (Нет кучи "устарелых" методов у классов, таких как например WriteHuge у CFile, библиотека написана с массированным применением ATL, что вызывает кучу проблем CString в "старом" коде). Очень велика вероятность, что сегодня написав код, ты не сможешь через пару лет скомпилировать его на новой версии студии от МС. Вопрос: тебе это надо? |
|||
|
||||
| mr.DUDA |
|
||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Хорошо, я согласен в том, что STL - это супер.
Но.
В любом случае придется реализовывать конкретную задачу, algorithm'ы конечно помогают, но временные затраты на освоение намного больше, чем на написание "того же самого", пользуясь очень простыми средствами MFC;
Кто сказал, что CMap и CList - не шаблоны ? Разве код становится быстрее, если он генерится с подстановкой указанных типов на этапе компиляции а не при написании кода ? Опять же, MFC тож имеет модульную структуру и не всё из MFC включается в результирующий .OBJ, а только те ф-ции и классы, что были задействованы в коде;
Никто еще не освобождал от ответственности за освобождение памяти С четвертым и пятым пунктами согласен (мелкомягкие не утруждают себя детальной отладкой всего, что выпускают), но опять-таки, за счет чего выигрыш в скорости ? От использования других соглашений наименования классов и функций ? Чел(ы), который написал контейнеры в MFC - разве не знаком с STL ? Насчет седьмой версии MFC - нет, оно мне не надо. Если понадобится функциональность ATL - легче написать проект "полностью ATL", чем корябать под смешанным MFC+ATL. Набор классов MFC тем и хорош, что он полностью заточен под написание готовых, полноценных Desktop-app продуктов, и контейнеры MFC, IMHO органично дополняют остальную часть библиотеки. -------------------- ![]() |
||||||
|
|||||||
| DENNN |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
MFC хорош только тем, что позволяет написать Windows приложение без создание множества строчек кода на WinAPI и более ничем. Если ты стараешься меня убедить, что MFC- это библиотека, заточенная под хранение и обработку информации, то ты очень сильно заблуждаешься. То что ты наследовал калсс в цепочке из ста родителей не избавляет тебя от остальных трудностей, но добавляет лишние тормоза и вероятность ошибки в коде.
Это говорит о том что ты не полностью представляешь себе различие шаблонов и ООП. А МС конечно с Stl хорошо знакома, просто их фишка в том, что весь код который они продают - их собственный, а если у тебя в каждой 20 строке STL (а его пока стандартом C++ не сделали), то как тогда себя гениальным называть?
Давай не спорить, а говорить конкретно: какие это очень простые средства? Почитай учебники по STL, то что на STL описывается 3 строчками, на MFC может занимать несколько десятков. Что же после этого проще: научиться пользоваться шаблонами и STL или заучивать справку по мсдн и всем своим знакомым объяснять почему для сортировки ряда чисел твоей программе требуется платная бибилиотека МС?
Это говорит лишь о том, что ты не задумался над проблемой динамического массива. А наилучший тот вариант, который реализуется проще всего. P.S. Это еще поклонники борланда молчат. |
||||||||||
|
|||||||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Попробую разобраться с STL..
P.S> А насколько STL старая библиотека? -------------------- ![]() |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Если мои сведения верны:
Первые реализации такого шаблонного кода были сделаны с финансов HP в середине 80-х. Затем это направление очень быстро стало развиваться. С VC6 поставляется код, созданный на базе HP, но переработанный dundas software для МС (в названии фирмы могу ошибаться) несколько лет назад. Что поставляется с 7 версии студии я не знаю, но видимо опять что то подправили. Если по каким-то причинам тебе эта рализация не нравиться в сети можно найти множество альтернативных. Самая популярная видимо STL Port, наверное потому что как правило все выпускаемое SGI работает быстро и без неизвестных багов. Кроме того open source кое что значит ;) |
|||
|
||||
| mr.DUDA |
|
||||||||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
To DENNN
Кстати, насчет различий ООП и шаблонов. Сравним следующий код:
и
а также
и
(то же самое для map) Различия минимальны. В обоих случаях контейнеры - это шаблоны классов, только MFC добавляет к результирующему классу функциональность CRuntimeClass (определение класса во время выполнения и при сериализации). Конкретнее можно, что я не понимаю в ООП ? И насчет сотни базовых классов. Как видим из примера, базовый класс один. Мелкософт не пошла по пути Borland, делая из наследования самоцель. Последнее - про размер и быстродействие. Все-таки, я не до конца согласен насчет компактности STL. Глянуть только на кол-во методов, включаемых в простейший контейнер vector:
и сравнить с полным набором методов у CArray:
Вопросик: какой из них даст более длинный код, учитывая, что среднее кол-во строк у каждого метода примерно одинаковое в CArray и vector ? Мой респект, DENNN, всё-таки окончательный выбор - дело каждого, я попробую разобраться в STL и определить для себя, что все-таки лучше - тратить время на освоение абсолютно чужой формы записи, или юзать простые (все же, ОЧЕНЬ простые) MFC'шные контейнеры. -------------------- ![]() |
||||||||||||
|
|||||||||||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Выбирай что хочешь.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |