![]()  | 
![]() ![]() ![]() ![]()  | 
![]()  | 
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.
реклама  |