![]() |
|
Модераторы: bsa |
![]()
|
|
| youriy86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.1.2011 Репутация: нет Всего: нет |
Всем привет.
У меня следующая задача: Мне нужно создать контейнер строк hash_set, организованный в виде хеш-таблицы. Этот контейнер должен определить свой итератор, который может перемещаться по элементам контейнера в определенном порядке. Подскажите плиз, как вообще определить итератор? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
кому он должен? видимо, такое желание продиктовано некоторыми внешними условиями. например, требованием сделать контейнер совместимым с алгоритмами STL. тогда нужно создать итератор в стиле STL - определить для него соответствующие типы и операции. вообще, итератор - специальный объект, позволяющий получать доступ к элементам коллекции. возможности итератора напрямую связаны с организацией коллекции. например, итератор доступа к элементам массива позволяет произвольный доступ (по индексу), а к элементам списка - последовательный. в некотором смысле понятие итератора является обобщением указателя в С/С++, и операции итератора делают похожими на операции с указателями: если I - тип итератора I iter - итератор *iter - элемент коллекции ++iter; --iter - перестановка итератора (последовательный доступ) iter += n; iter -= n - перестановка итератора (произвольный доступ) в STL контейнеры имеют методы begin() и end(), возвращающие итераторы. пример:
как реализовать итератор? это зависит от структуры данных, но ясно, что итератор должен внутри себя хранить некую ссылку на текущий элемент коллекции в простейшем виде может быть так (не является полностью совместимым с STL):
тут пример использования |
||||
|
|||||
| youriy86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.1.2011 Репутация: нет Всего: нет |
То есть получается итератор я должен завести внутри класса?
Добавлено через 12 минут и 41 секунду Вообще мне нужно реализовать хеш-таблицу и сделать у нее итератор, пробегающий по всем элементам. Как это сделать я вообще не понимаю даже с использованием предложенного примера, у меня же элементы в хэш-таблице хранятся не последовательно а в корзинах, в каждой корзине их может быть разное число. Каким образом можно организовать этот итератор?
Добавлено через 14 минут и 14 секунд У меня задание по STL просто. И в задаче нужно чтобы этот итератор мог пройтись по всем элементам hash_set от начала до конца, я так понимаю например чтобы можно было распечатать все эти элементы используя итератор. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
необязательно. у меня он внутри класса по двум простым соображениям 1. без класса итератор не имеет смысла 2. не стоит засорять глобальное пространство имен 3. лень лишний раз template писать хотя понятно, что
подходит под множество типов коллекций, хранящих T последовательно (в массиве) с другой стороны, это слишком упрощенный пример, не учитывающий множества ситуаций. это скорее учебный псевдокод (хоть и работающий) |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
youriy86, чтобы сделать STL совместимый итератор изучи сначала документацию на класс std::iterator.
Представляем контейнер в виде дерева. У дерева есть узлы и связи. У каждого узла есть связь с родителем и могут быть связи с дочерними узлами (могут быть вариации на тему, есть ли данные в узлах, имеющих дочерние узлы, или нет). Так вот, у тебя есть указатель на какой-то узел (итератор), чтобы получить указатель на следующий ты должен: 1. если есть дочерние узлы, то переход к первому из них 2. если нет дочерних, то рекурсивный возврат к следующему брату текущего узла |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
ну значит итератор должен хранить текущую корзину и индекс в корзине. это чуть сложнее, но не смертельно
Добавлено @ 16:11 для HashSet youriy86 это чересчур Это сообщение отредактировал(а) baldina - 1.2.2011, 16:13 |
||||
|
|||||
| youriy86 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.1.2011 Репутация: нет Всего: нет |
Привожу код, который у меня получился. Релизация AddElement и остальных функций в .cpp. Подумал отношения к делу не имеет, поэтому не привожу.
Вроде бы компилируется, но следующая запись ничего не выдает:
Это сообщение отредактировал(а) youriy86 - 1.2.2011, 19:32 |
||||
|
|||||
| baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Это сообщение отредактировал(а) baldina - 1.2.2011, 20:02 |
||||||
|
|||||||
| youriy86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.1.2011 Репутация: нет Всего: нет |
ОМГ заработало!!!!!!!!!!!! Я тя обожаю!!!! Спасибо большое!!!!!!!!!!!
|
|||
|
||||
| youriy86 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.1.2011 Репутация: нет Всего: нет |
Выкладываю по просьбе одного из форумчан
Присоединённый файл ( Кол-во скачиваний: 43 )
cpp.rar 1,33 Kb |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Может, всё-таки, ты хотел попросить кого-нибудь плюсануть baldina (поднять репутацию) ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| kolaspirit |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.12.2011 Репутация: нет Всего: нет |
Спасибо за исходники!
Кому интересно, могу предложить свою реализацию hash_set на основе хэш-таблицы. P.S. В моей реализации используются лямбда-функции, и она без циклов for и while (так было необходимо сделать по заданию). Для быстродействия использованы стандартные алгоритмы STL. Присоединённый файл ( Кол-во скачиваний: 32 )
hash_set.rar 2,39 Kb |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |