![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Jcs |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Есть небольшая проблема:
имеет класс
имеем шаблонную функцию:
проблема - передать указатель на внешнюю функцию в Inject. Сначала я хотел определить явную реализацию функции cmp_def для T = const CListA<T>::iterator, но как это сделать - к сожалению не знаю. Для встроенных типов это сделать несложно
, но в случае итераторов получается вложенность шаблонов. Второй вариант - написать отдельную функцию
Но тогда встают сразу две проблемы - нельзя задать функцию по умолчанию (если определить ее до класса, тогда не достучаться до итератора,т.к. класс еще не определен; если после - тогда не будет видно самой функции в классе). Но даже если отказаться от функции по умолчанию, то возникает проблема преобразования из 'bool (const CListA<T>::iterator&,const CListA<T>::iterator&)' в 'bool (__cdecl *)(const CListA<T>::iterator &,const CListA<T>::iterator&). Если кто ответит - буду очень признателен. Заранее спасибо. |
||||||||
|
|||||||||
| FreshMeat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 30.1.2004 Репутация: нет Всего: нет |
Не мог бы ты описать логику работы класса (или хотя бы метода Inject)? Почему для вставки (?) элементов требуется сравнивать итераторы? Каким образом результат сравнения будет определять позицию нового элемента в контейнере?
|
|||
|
||||
| FreshMeat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 30.1.2004 Репутация: нет Всего: нет |
Возможно тебе поможет следующий код (логика отсутствует, но т.к. задача не совсем понятна, больше написать ничего не могу)
|
|||
|
||||
| Jcs |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Класс CList - просто контейнер-список, а функция Inject используется для вставки конкретного итема в необходимую позицию отсортированного списки, к примеру если есть список 1,2,3,5, то 4 функция вставит перед 5) Для быстрого поиска реализован массив итераторов, которые очень похожи на обычные указатели. Т.е. сначала ищется место в таблице итераторов, а затем в самом списке. Массив итераторов просто хранит в себе прореженные значения списка ( с обвязками) и его назначение - увеличить быстродействие функции Inject. Поиск элемента в отсортированном массиве я тоже вынес в отдельный класс (шаблонный CSrtdData<T>), т.к. предполагается его часто использовать. Поиск ведется функцией-членом, которая принимает ссылку на шаблонный итем и указатель на функцию сравнения (find_index(const T& item,bool(*fcmp)(const T&,const T&)) ) Вот этот-то указатель я и не могу подсунуть (см. выше).
По умолчанию подсовывался указатель на cmp_def, но для сравнения итераторов их надо разименовать, т.е. алгоритм будет другим. Для этого хотел определить отдельно cmp_def с типом константная ссылка на итератор, но не вышло. Такая вот хрень... Огород конечно еще тот нагородил, но как по-другому - пока не знаю. |
|||
|
||||
| FreshMeat@Home |
|
|||
|
Unregistered |
typedef std::multiset<T> CList?
Ассоциативные контейнеры (Associative containers) Ассоциативные контейнеры обеспечивают быстрый поиск данных, основанных на ключах. Библиотека предоставляет четыре основных вида ассоциативных контейнеров: set (множество), multiset (множество с дубликатами), map (словарь) и multimap (словарь с дубликатами). Все они берут в качестве параметров Key (ключ) и упорядочивающее отношение Compare, которое вызывает полное упорядочение по элементам Key. Кроме того, map и multimap ассоциируют произвольный тип T с Key. Объект типа Compare называется сравнивающим объектом (comparison object) контейнера. http://www.rsdn.ru/article/cpp/stl.xml |
|||
|
||||
| Jcs |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Ссылка крутая, описание stl если где-то и есть то в основном в кастрированном виде, здесь все круто. И из ситуации вышел довольно просто - объявил еще одну шаблонную функцию для сравнения, которая предварительно разыменовывает свои параметры. Долбиться до итератора в этом случае не надо. А инстанцировать шаблонную функцию можно только для конкретного типа, например для
template<> bool cmp_def(const CListA<int>::iterator& left, const CListA<int>::iterator& right) {...}, что в принципе логично. Спасибо за помощь. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
поздравляю, мы получили идею об "алгоритмах" из STL ! З.Ы. зачем реализовывать то, что уже сделано и не раз ? -------------------- ![]() |
|||
|
||||
| Jcs |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Во-первых алгоритм работы не совсем такой, как в STL (можно, конечно, использовать наследование, но все-таки хотелось бы знать как там все работает ), во-вторых - иногда проще написать свое, чем разобраться в чужом, а в третьих - во время написания таких базовых классов с изучением исходников STL можно понять и овладеть некоторыми навыками и приемами программирования.
|
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Jcs
ссылки про шаблоны шаблоны1 шаблоны2 Может еще че-нить полезное обнаружишь А есть классная книга: Д. Вандервуд, Н.М. Джосаттис "ШАБЛОНЫ С++. Справочник разработчика" Советую приобрести. Куча полезной инфы по программированию. После этой книги, STL - отдыхает Это сообщение отредактировал(а) bel_nikita - 26.2.2004, 17:20 |
|||
|
||||
| FreshMeat |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 30.1.2004 Репутация: нет Всего: нет |
хочется знать - смотри исходники :)
код такого качества как стл? не проще. не веришь? попробуй почитай Саттера "Решение сложных задач на С++", когда посмотришь на exception safety, останется махнуть рукой на собственные начинания :)
можно. но иногда бывает очень сложно :). разработчики не оставляют в коде комментариев, по поводу архитектурных решений, поэтому можно легко впасть в заблуждение или просто не понять почему применяется тот или иной подход (особенно хитрые трюки можно просто не заметить :) ) может будет интересно www.stlport.org - одна из самых популярных и быстрых реализаций STL
гы :) забавная формулировка :) ценности ссылки это не отменяет :)
Что значит СТЛ отдыхает? 2Jcs Если хочешь качественно разобраться с шаблонами, книга must have. |
||||||||||
|
|||||||||||
| Jcs |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Насчет качества написания STL - я не претендую))) Ведь там крутые чуваки писали, которые у самых можно сказать истоков языка стояли. Но если читать описание (варианты которых, кстати, не отличаются подробным описанием используемых трюков и приемов), то далеко не уйдешь. Мне лично без практики простое изучение практически ничего не дает (у каждого свои методы). А где, как не в своих базовых классах я смогу попробовать увиденные приемы?.. Задачи, где это можно применить встречаются не так уж часто.. Пусть сначала получится класс-выродок, который спустя некоторое время кроме смеха ничего вызывать не будет, но как без этого?
Всех нюансов, конечно не постигнешь, по крайней мере, сразу.. Но по-моему лучше убить денек-другой на постигание приема, чем написать за эти пару дней сотни строк непрофессионального кода. А в STL приемов, наверное, хватит на все возможыне ситуации.. так что надо дерзать.. Спасибо за ссылки. Если не секрет, вы с STL разбирались, или просто использовали? |
|||
|
||||
| FreshMeat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 30.1.2004 Репутация: нет Всего: нет |
По мере необходимости разбирался, по большей части использую :) Если есть время и больше его нечем занять :), то можно и по интересным исходникам полазить... Еще одна ссылка до кучи. http://www.rsdn.ru. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
А чем не подходит способ
-------------------- Волны гасят ветер... |
|||
|
||||
| Jcs |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 1.10.2003 Репутация: нет Всего: нет |
Тем, что cmp_def не разыменовывает итераторы перед сравнением. А инстанцировать cmp_def<T> для T = CListA<T,ALLOCATOR>::iterator я не смог, т.к. класс CListA сам шаблонный.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |