![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Map TraitsBoost , Chapter 1. Boost.Icl , Concepts
|
тип |
операция |
элемент идентификации |
---|---|---|
< |
добавление |
< |
< |
конкатенация |
< |
< |
Союз |
< |
В этих случаях значение<identityelement
>доставляется по умолчанию конструктором карт<CodomainT
>типа. Но есть хорошо известные исключения, такие как численное умножение:
тип |
операция |
элемент идентификации |
---|---|---|
< |
Умножение |
< |
Поэтому функторы icl, которые служат<Combiner
>параметрами icl Maps, реализуют статическую функцию<identity_element()
>, чтобы убедиться, что правильное<identity_element()
>используется при реализацииагрегата на перекрытии.
inplace_times<int>::identity_element() == 1 // or more general inplace_times<T>::identity_element() == unit_element<T>::value()
Есть двасвойстваиличертыкарт icl, которые могут быть выбраны параметром шаблона<Traits
>.Первая чертаотносится копределенностикарты. Карты Icl могут бытьчастичнымиилиполнымина наборе значений, заданных типом домена<DomainT
>.
вторая чертасвязана с представлением<identity
elements
>на карте. Карта icl может представлять собойпоглотитель идентичностиилиобогатитель идентичности.
(k,0)
>, которые несут элементы идентичности.(k,0)
>.Для шаблонного параметра<Traits
>icl Maps мы имеем следующие четыре значения.
поглотитель идентичности |
обогащающий личность |
|
---|---|---|
частичный |
partial_absorber(по умолчанию) |
Partial_enricher |
Всего |
Total_absorber |
Total_enricher |
Черты карты являются поздним расширениемicl. Интервальные карты использовались в течение нескольких лет в различных приложениях Cortex Software GmbH с реализацией, которая напоминала черту по умолчанию. Только более глубокий анализ концепции ИКЛ, объединяющей концепцию Картыв ходе подготовки библиотеки к повышению, привел к введению черт карты.
Конституциональность для поглотителя/обогащения является немного антиномией.
Мы можем вставить пары значений на карту, добавивна карту посредством операций<add,+=
>или<+
>:
{} + {(k,1)} == {(k,1)} // addition
Дополнительное дополнение к общим ключам вызывает агрегацию:
{(k,1)} + {(k,1)} == {(k,2)} // aggregation for common key k
Вычитание существующих пар
{(k,2)} - {(k,2)} == {(k,0)} // aggregation for common key k
, которые связаны с 0-значениями или<identity
elements
>.
Таким образом, как только пара значений создается для ключа<k
>, она не может быть удалена с карты посредством вычитания<subtract,-=
>или<-
>.
Самый основной факт на съемочной площадке, что мы можем удалить то, что мы ранее добавили.
x - x = {}
не применяется.
Это мотивация дляпоглотителя идентичностиТрактата. Карта поглотителя идентичности обрабатывает пары значений, которые несут элементы идентичности какнесуществующие, что сохраняет закон:
x - x = {}
Тем не менее, это создает новую проблему: С такимпоглотителем идентичностимыпо определениюне можем хранить значение<(k,0)
>на карте. Это может быть неблагоприятным, поскольку не соответствует поведению stl::maps и этого не обязательно ожидают клиенты библиотеки.
Решением проблемы является внедрение обогатителя идентичности Trait, чтобы пользователь мог выбрать вариант карты в соответствии с ее потребностями.
Идея карты поглощения идентичности состоит в том, чтосвязанный элемент идентификациизначение пары<(k,0)
>кодирует несуществованиедля его ключа<k
>. Таким образом, пара<(k,0)
>немедленно туннелирует с карты, где она может выйти в царство несуществования.
{(k,0)} == {}
Если элементы идентификации не кодируютнесуществование, носуществование с нулевой квантификацией, мы также можем думать о карте, которая имеет ассоциированный элемент идентичностидля каждого<k
>ключа, который не имеет ассоциированного значения, отличного от 0. Таким образом, в отличие от моделированиявсехпар нейтральных значений<(k,0)
>какнесуществующих, мы можем моделироватьвсепары нейтральных значений<(k,0)
>какнеявно существующих.
Карта, смоделированная таким образом, представляет собой один большой вектор со значением<v
>для каждого ключа<k
>его доменного типа<DomainT
>. Но на самом деле хранятся только значения неидентификации. Это и есть мотивация для определения пути<icl
Maps
>.
частичнаякарта моделирует интуитивное представление о том, что существуют только пары значений, которые хранятся на карте.общаякарта использует возможность того, что все пары значений, которые не хранятся, могут рассматриваться как существующие иколичественнос элементом идентификации.
С прагматической точки зрения пары значений, которые несут<identity
elements
>в виде отображенных значений, часто могут быть проигнорированы. Если мы посчитаем, например, количество перекрытий вставленных интервалов в<interval_map
>(см. пример, перекрывающий счетчик), большую часть времени, нас не интересует, было ли перекрытие подсчитано<0
>раз или вообще не было подсчитано. Карта обогащения идентичности нужна только в том случае, если мы хотим различать несуществование и 0-квантификацию.
Следующее различие может быть сделанонедля<partial_absorber
>карты, но оно может быть сделано для<partial_enricher
>карты:
(k,v) does not exist in the map: Pair (k,v) has NOT been dealt with (k,0) key k carries 0 : Pair (k,v) has been dealt with resulting in v=0
Иногда это тонкое различие необходимо.<partial_enricher
>Это правильный выбор. Кроме того, если мы хотим дать два<icl::Maps
>общего набора ключей, чтобы, скажем, синхронно повторяться по обеим картам, нам нужныобогатители.
Статья Map Traits раздела Chapter 1. Boost.Icl Concepts может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |