Посоветуйте структуру данных

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Посоветуйте структуру данных

Сообщение Faust » 07.07.2005 (Чт) 19:29

Есть ли структура данных, позволяющая динамическое добавление/удаление элементов и способная возвратить индекс элемента по его значению (значения не повторяются)? Я поэксперементировал с упорядоченными динамическими массивами и со списками (списки писал сам, могу выложить код, если кого заинтересует). В массивах слишком долго добавлять/удалять элементы, в списках - обращаться к произвольному элементу. У меня есть подозрение, что нужного эффекта можно добится, используя ключи в коллекциях, но я ни разу с ними не работал, да и коллекция, ИМХО, не рекордсмен в быстродействии. Чувствую, прийдется штудировать теорчасть - может, кто даст полезную ссылку иль пример какой подбросит?
Листинги не горят!

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 07.07.2005 (Чт) 20:25

на счет коллекций ИМХО ты не совсем прав, в некоторых случаях они работают даже быстрее, чем массивы

а вообще ,конечно, книжку стоит всегда почитать, что-нибудь интересное найдешь (например, Брюса Мак-Кинни) :)

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 07.07.2005 (Чт) 20:35

Можешь дать пример реализации сабжа с помощью коллекции? А то я в работе с ними неопытен.
Книжки под рукой нет, мне бы ссылочку...
Листинги не горят!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.07.2005 (Чт) 21:46

Низзя индекс по значению вернуть в стандартной коллекции :-(
Можно написать свою хеш-таблицу (это не так уж сложно), можно заюзать коллекцию от emorcillo - там это вроде бы есть. Ссылку на коллекцию от emorcillo я только что давал в Народном поиске.
Изображение

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Посоветуйте структуру данных

Сообщение codemaster » 08.07.2005 (Пт) 11:25

Faust писал(а):Есть ли структура данных, позволяющая динамическое добавление/удаление элементов и способная возвратить индекс элемента по его значению (значения не повторяются)?


XML ?
//<-
Mit freundlichen Grüßen
//->

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 08.07.2005 (Пт) 12:33

а почему не реализовать через класс?
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.07.2005 (Пт) 12:40

Индекс по значению??? Обычно требуется обратное. Что ж ты такое пишешь, если не секрет.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.07.2005 (Пт) 13:44

Ennor писал(а):Индекс по значению??? Обычно требуется обратное. Что ж ты такое пишешь, если не секрет.

Ну не знаю, что там пишет Faust, но мне во вставлялке-символов нужно было то же самое. Я писал собственную хеш-таблицу.
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.07.2005 (Пт) 14:00

В таком случае значение и ключ меняются местами: в коллекцию добавляется элемент, чье значение - число, а ключ - строка. При этом ключевая строка является как раз нашим значением, а число - некий индекс в некой таблице... Не знаю, но так или иначе у меня возникает смутное ощущение, что Faust мутит что-то ненатуральное...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 08.07.2005 (Пт) 17:03

да, действительно, непонятно зачем такое нужно - значение и оно же ключ :?:
но по-любому Ennor уже все разжевал

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 08.07.2005 (Пт) 20:35

Спасибо всем. Я пишу вполне натуральную вещь: необходимо добавлять элементы в некое хранилище, причем каждый элемент должен встречатся в нём только один раз. На самом деле, проверка осуществляется только по одному полю структуры (ID), и вот, если в хранилище уже есть элемент с данным ID, то неплохо было бы знать его индекс, для того, чтобы внести соответствующие изменения в другие поля.
Листинги не горят!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.07.2005 (Пт) 20:58

Как вариант: массив-хранилище + коллекция-справочник. В коллекции ключ - ID, значение - индекс.
Подходит?
Изображение

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 09.07.2005 (Сб) 3:02

Нет, даже не так... Тут нужен ключ, формируемый по заданному алгоритму.

Скажем так: при добавлении своей структуры в коллекцию ты задаешь ей ключ, сделанный вот так:
Код: Выделить всё
Key = "_" & CStr(MyStruct.ID)
Внутренняя реализация коллекции такова, что если передаваемое ей значение ключа преобразовывается в численный тип (IsNumeric(Key) = True, проще говоря), то она дает отлуп и файрит ошибку. Это сделано ради универсализации свойства Item(Key as Variant), которое, в зависимости от типа переданного аргумента, расценивает его либо как порядковый индекс (если это число), либо как ключ (если это строка). Ну нету в VB6 перегрузки, ну что поделаешь. Хотя лично я... впрочем, позже. Полагаю, зачем в начале ключа ставится символ подчеркивания, всем понятно - чтобы за число не посчитало.

Теперь нам нужно выяснить, есть ли в коллекции элемент с таким ключом. В данном случае это делается элементарно:
Код: Выделить всё
Dim V as MyStruct, NewStruct as MyStruct
' Fill NewStruct members here
'...
' We need it, sorry
On Error Resume Next
' Try to get item with this key, if it exists
V = Coll("_" & CStr(NewStruct.ID))
' Check for existence
If Err.Number <> 0 Then
  ' Item already exists, rollback transaction
Else
  ' Add NewStruct to the collection
End If
' Restore error handler
On Error Goto EH

Я не знаю, насколько сильно бьет по производительности отключение обработки ошибок, но это должно работать всяко быстрее, чем For Each ... Next по произвольного размера коллекции с проверкой члена каждого элемента на совпадение (к счастью, хоть сравнение числовое, а не строковое). У себя, если мне приходится использовать коллекции, я обычно пишу именно так. Более того, аналогичным способом я проверяю существование элемента при написании свойства .Item().

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.07.2005 (Сб) 14:22

Ennor писал(а):Нет, даже не так... Тут нужен ключ, формируемый по заданному алгоритму.

Скажем так: при добавлении своей структуры в коллекцию ты задаешь ей ключ, сделанный вот так:
Код: Выделить всё
Key = "_" & CStr(MyStruct.ID)
Внутренняя реализация коллекции такова, что если передаваемое ей значение ключа преобразовывается в численный тип (IsNumeric(Key) = True, проще говоря), то она дает отлуп и файрит ошибку. Это сделано ради универсализации свойства Item(Key as Variant), которое, в зависимости от типа переданного аргумента, расценивает его либо как порядковый индекс (если это число), либо как ключ (если это строка). ... Полагаю, зачем в начале ключа ставится символ подчеркивания, всем понятно - чтобы за число не посчитало.

Я тоже так раньше считал, но GSerg открыл мне глаза :-)
Оказывается, Key = CStr(MyStruct.ID) прекрасно работает.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 73

    TopList  
cron