Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C++] Класс Словарь с дубликатами

271
17 октября 2007 года
MrXaK
721 / / 31.12.2002
Собсна задание:
Словарь с дубликатами – это структура данных, обеспечи-вающая доступ к информации по ключу и допускающая хране-ние элементов данных с одинаковыми ключами. Ключи словаря могут быть любого типа. Словарные данные (значения) могут быть также любого типа. Пример словаря с дубликатами: англо-русский словарь, элементы которого содержат слово на англий-ском языке (ключ) и вариант перевода слова на русский язык (значение), например, {[list] – список,[list] – перечислять}. Сло-варь может содержать произвольное количество элементов.
Операции словаря:
-создание пустого словаря;
-добавление элемента в словарь;
-исключение элементов с заданным ключом из словаря;
-поиск значений по ключу;
-изменение значения элемента словаря;
-вывод словаря в порядке возрастания ключей.

полный код в принципе не нужен, хотя не откажусь... нужны советы..
первое - STL использовать нельзя.. то есть надо самому реализовавывать класс структуры данных...
вопрос 1: какую структуру данных лучше использовать для этой задачи?
я планировал использовать двусвязный список.. узел списка содержит ключ и указатель на список со значениями... ну соответственно перегрузить оператор []... дальше перегрузить операторы < > == для элементов списка, чтобы при вставке сразу вставлять новое слово куда надо, чтобы список был упорядоченным... правильный ли это подход, или можно сделать проще?
350
18 октября 2007 года
cheburator
589 / / 01.06.2006
Простейший вариант - установить какую-либо среду разработки и скопировать multi_map оттуда.
map и multi_map обычно основаны на деревьях, как правило, на красно-черных. Случаи повторения одинаковых ключей можно свести либо к списку, либо к тому, что одинаковые значения хранятся в самом дереве, будто они разные, типа как:
корневой элемент = 2
подчиненный левый элемент = 2
подчиненный правый элемент = 3
320
18 октября 2007 года
m_Valery
1.0K / / 08.01.2007
Cписок тут не годится.Хочу подчеркнуть , что словарь - это map.В твоем случае нужен multimap , поскольку допускаются дубликаты.В словаре должен быть быстрый поиск по ключу, а не вставка в произвольную позицию.Список имеет медленный поиск , но быструю вставку в произвольную позицию.А как раз вставка в произвольную позицию тебе и не нужна.
P.S.Такие задачи без STL - это ...:D
271
18 октября 2007 года
MrXaK
721 / / 31.12.2002
ну надо без STL... требование такое.. ладно, сенкс, пойду читать про multimap.. позже результать сюда выложу, авось чего получится
350
18 октября 2007 года
cheburator
589 / / 01.06.2006
Цитата: m_Valery
В словаре должен быть быстрый поиск по ключу, а не вставка в произвольную позицию.Список имеет медленный поиск , но быструю вставку в произвольную позицию.


Вообще-то, в ассоциативных контейнерах вообще нет понятия "вставка в какую-то позицию". Есть просто вставка.

320
18 октября 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: cheburator
Вообще-то, в ассоциативных контейнерах вообще нет понятия "вставка в какую-то позицию". Есть просто вставка.



Есстественно.Но речь пока идет о выборе контейнера для класса словаря.Реализовать этот класс можно по разному,необязательно с multimap,можно и со списком,и с вектором и с деком.
Сам по себе словарь(я не имею ввиду multimap) должен :

  • хранить пары ключ-значение
  • быть упорядоченным по ключу
  • обеспечивать быстрый поиск значения по ключу
Это и есть map или multimap.Главная функция словаря-это поиск,а не вставка.А в ассоциативных контейнерах вставки в определенную позицию нет.Сама по себе функция insert для ассоциативных контейнеров в 3 вариантах:
  • coll.insert(elem) - вставляет копию elem и возвращает позицию нового элемента
  • coll.insert(pos,elem) - вставляет копию elem и возвращает позицию нового элемента(pos - определяет рекомендуемую позицию с которой следует начинать поиск позиции вставляемого элемента)
  • coll.insert(beg,end) - вставляет копию интервала [beg,end] и не возвращает значения
Но Mr.Hacker собрался делать список,я и говорю,что список позволяет быстро вставлять в произвольную позицию,но обладает медленным поиском.К тому же придется все равно в список вставлять пары.Список не подходит.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог