Мое почтение, джентльмены.
Родилась идея завернуть один из стандартных контейнеров С++ ) в СОМ (для возможности пользоваться и из VBA)
Идея понравилась и реализована (часть методов будет добавлена при необходимости).
Особенности:
-ключ и значение сейчас реализованы как String теперь можно использовать любые данные в качестве ключа и значения
-это хеш-таблица, а поэтому: поиск, вставка и удаление элементов имеют среднюю постоянную сложность.
-стабильно быстрее в разы/порядки Collection и Dictionary
-ВАЖНО! сейчас реализовано сохранения данных в контейнере до момента закрытия библиотеки (xll), т.е. выполнив процедуру в модуле, при выполнении следующей процедуру - данные в контейнере останутся. Это позволяет хранить данные (к примеру, как на листе). Если нужен чистый контейнер, просто очищаем когда нужно.
Новая реализация позволяет создавать любое количество хеш-таблиц и автоматом удаляет их при завершении работы процедуры/функции
Test_Collection_vs_Dictionary_vs_UnorderedMap
Результаты на 1 млн строк, с 1 млн итераций:
Внесение данных, Collection.Add = 13,09766
Внесение данных, Dictionary.Add = 73,87109
Внесение данных, U.TryEmplace = 0,9726563
Поиск верных данных, Collection.Item = 4,703125
Поиск верных данных, Dictionary.Item = 72,79688
Поиск данных, U.Find = 0,8007813
Итого элементов в UnorderedMap 1000000
Как использовать?
-Так же как и словарь или коллекцию
Если будет интерес - будем развивать проект.
на beta-версию.
Родилась идея завернуть один из стандартных контейнеров С++ ) в СОМ (для возможности пользоваться и из VBA)
Идея понравилась и реализована (часть методов будет добавлена при необходимости).
Особенности:
-
-это хеш-таблица, а поэтому: поиск, вставка и удаление элементов имеют среднюю постоянную сложность.
-стабильно быстрее в разы/порядки Collection и Dictionary
Новая реализация позволяет создавать любое количество хеш-таблиц и автоматом удаляет их при завершении работы процедуры/функции
Test_Collection_vs_Dictionary_vs_UnorderedMap
Скрытый текст | ||
|---|---|---|
|
Результаты на 1 млн строк, с 1 млн итераций:
Внесение данных, Collection.Add = 13,09766
Внесение данных, Dictionary.Add = 73,87109
Внесение данных, U.TryEmplace = 0,9726563
Поиск верных данных, Collection.Item = 4,703125
Поиск верных данных, Dictionary.Item = 72,79688
Поиск данных, U.Find = 0,8007813
Итого элементов в UnorderedMap 1000000
Как использовать?
-Так же как и словарь или коллекцию
| Код |
|---|
Sub UnorderedMap() Dim U As New BedvitCOM.UnorderedMap ': Set r = New BedvitCOM.VBA 'раннее связывание Dim key, value, value2, sizeU, x key = "key" value = "value" If (U.Insert(key, value) = 0) Then MsgBox "Элемент уже существует и не был обновлен" If (U.InsertOrAssign(key, value) = 0) Then MsgBox " = 0 - Элемент обновлен" 'если = 1 то создан новый Debug.Print U.Size 'количество элементов контейнера If (U.Find(key, value2) = 0) Then MsgBox "Не удалось найти элемент" Debug.Print value2 'выводим найденный результат по ключу If (U.Erase(key) = 0) Then MsgBox "Не удалось удалить элемент" 'очистка элемента по ключу Debug.Print U.Size U.Clear 'очистить весь контейнер End Sub |
Если будет интерес - будем развивать проект.
на beta-версию.
Изменено: - 01.06.2021 18:04:29
«Бритва Оккама» или «Принцип Калашникова»?