BedvitCOM.UnorderedMap

Реализация в COM ассоциативного контейнера, содержащего пары ключ-значение с уникальными ключами. Поиск, вставка и удаление элементов имеют среднюю постоянную сложность.
Часть библиотеки
BedvitCOM (начиная с v1.0.4.7, в XLL c v2.0.1.5)
Использован стандартный контейнер С++:
std::unordered_map (хеш-таблица)

КЛЮЧ: можно использовать любые данные (не включая ссылки на массивы и объекты), ключ хранится как строка (конвертируется, если нужно, из другого типа данных).

ЗНАЧЕНИЕ: можно использовать любые данные (включая ссылки на массивы, объекты и даже на другую хеш-таблицу)

 

Методы:
1.Find(key,value) - Поиск значения по ключу, возвращает true, если найден. Если value задан - возвращает значение (опционально)
2.Insert(key,value) - Вставляет пару ключ-значения по ключу, возвращает true, если успешно, false - если ключ уже есть (не перезаписывается)
3.InsertOrAssign(key,value) - Вставляет или перезаписывает пару ключ-значения по ключу, возвращает true, если создан новый и false если обновлен уже существующий.
4.Erase(key) - Удаляет пару ключ-значения по ключу, возвращает true, если успешно.
5.Clear() - Очистить весь контейнер.
6.Size() - Возвращает размер контейнера (количество пар ключ-значение)
7.RangeSet(VARIANT range) - Вставляет пары ключ-значения из массива/диапазона, возвращает количество вставленных пар ключ-значение. Из дубликатов - загружается только первый по порядку.
8.RangeGet(VARIANT range, lowerBound) - Возвращает количество выгруженных элементов в массив с указанной нижней границей массива (по умолчанию = 0)
Следуя названию контейнера, стоит упомянуть, что порядок пар ключ-значение, определяется внутренней реализацией контейнера, и может не совпадать ни с порядком добавления пар, ни с каким-либо еще порядком сортировки и т.д.
т.е. порядок элементов загруженного массива, может не совпадать с порядком элементов выгруженного.
+хранятся только уникальные ключи, т.е. все последующие дубликаты не будут добавлены из исходного массива.



Проведенные тесты и сравнения с Collection и Dictionary (быстрее от нескольких раз до нескольких порядков)


Пример использования


[VBA]

Sub UnorderedMap()
Dim key, value, value2, sizeU, x, arrU
Dim U As New BedvitCOM.UnorderedMap 'раннее связывание
'Dim U: Set U = CreateObject("BedvitCOM.UnorderedMap") 'позднее связывание
 
key = "key" 'ключ
value = "value" 'значение
If Not U.Insert(key, value) Then MsgBox "Элемент уже существует и не был обновлен"
If Not U.InsertOrAssign(key, value) Then MsgBox " = False (False - Элемент обновлен, True - то создан новый)"
If Not U.Find(key, value2) Then MsgBox "Не удалось найти элемент" 'выводим найденный результат по ключу
If Not U.Erase(key) Then MsgBox "Не удалось удалить элемент" 'очистка элемента по ключу

x = U.RangeSet(Range("a1:b5").value) 'x - количество загруженных элементов в map (первый дубликат)
x = U.RangeGet(arrU, 1) 'x - количество выгруженных элементов в массив '1-нижняя граница массива
Range("c1").Resize(x, 2) = arrU

Debug.Print U.Size 'количество элементов контейнера
U.Clear 'очистить весь контейнер
End Sub

[/VBA]

 

 

 

Полное описание в блоге.

Яндекс.Метрика