Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Map Traits

Boost , Chapter 1. Boost.Icl , Concepts

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Карты Icl отличаются по своему поведению в зависимости от того, как они обрабатываютэлементы идентичностисвязанного типа<CodomainT>.

Remarks on Identity Elements

В псевдокоде фрагменты ниже<0>будут использоваться для обозначения<identityelements>, которые могут быть различными объектами, такими как<const double0.0>, пустые наборы, пустые строки, нулевые векторы и т.д., зависящие от типа экземпляра для параметра<CodomainT>. Существованиеэлемента идентификацииwrt. a<operator+=>является требованием для типа шаблона<CodomainT>.

тип

операция

элемент идентификации

<int>

добавление

<0>

<string>

конкатенация

<"">

<set<T>>

Союз

<{}>

В этих случаях значение<identityelement>доставляется по умолчанию конструктором карт<CodomainT>типа. Но есть хорошо известные исключения, такие как численное умножение:

тип

операция

элемент идентификации

<int>

Умножение

<1>

Поэтому функторы 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()

Definedness and Storage of Identity Elements

Есть двасвойстваиличертыкарт icl, которые могут быть выбраны параметром шаблона<Traits>.Первая чертаотносится копределенностикарты. Карты Icl могут бытьчастичнымиилиполнымина наборе значений, заданных типом домена<DomainT>.

  • частичнаякарта определяется только на тех ключевых элементах, которые были вставлены в Карту. Это обычно ожидается, и поэтомучастичная определенностьявляется по умолчанию.
  • Альтернативно, карта icl может быть. Затем считается, что он содержитнейтральное значениедля всех ключевых значений, которые не хранятся на карте.

вторая чертасвязана с представлением<identity elements>на карте. Карта icl может представлять собойпоглотитель идентичностиилиобогатитель идентичности.

  • поглотитель идентичностиникогда не хранит пары значений<(k,0)>, которые несут элементы идентичности.
  • обогатитель идентичностихранит пары значений<(k,0)>.

Для шаблонного параметра<Traits>icl Maps мы имеем следующие четыре значения.

поглотитель идентичности

обогащающий личность

частичный

partial_absorber(по умолчанию)

Partial_enricher

Всего

Total_absorber

Total_enricher

Map Traits motivated

Черты карты являются поздним расширениемicl. Интервальные карты использовались в течение нескольких лет в различных приложениях Cortex Software GmbH с реализацией, которая напоминала черту по умолчанию. Только более глубокий анализ концепции ИКЛ, объединяющей концепцию Картыв ходе подготовки библиотеки к повышению, привел к введению черт карты.

Add-Subtract Antinomy in Aggregating Maps

Конституциональность для поглотителя/обогащения является немного антиномией.

Мы можем вставить пары значений на карту, добавивна карту посредством операций<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, чтобы пользователь мог выбрать вариант карты в соответствии с ее потребностями.

Partial and Total Maps

Идея карты поглощения идентичности состоит в том, чтосвязанный элемент идентификациизначение пары<(k,0)>кодирует несуществованиедля его ключа<k>. Таким образом, пара<(k,0)>немедленно туннелирует с карты, где она может выйти в царство несуществования.

{(k,0)} == {}

Если элементы идентификации не кодируютнесуществование, носуществование с нулевой квантификацией, мы также можем думать о карте, которая имеет ассоциированный элемент идентичностидля каждого<k>ключа, который не имеет ассоциированного значения, отличного от 0. Таким образом, в отличие от моделированиявсехпар нейтральных значений<(k,0)>какнесуществующих, мы можем моделироватьвсепары нейтральных значений<(k,0)>какнеявно существующих.

Карта, смоделированная таким образом, представляет собой один большой вектор со значением<v>для каждого ключа<k>его доменного типа<DomainT>. Но на самом деле хранятся только значения неидентификации. Это и есть мотивация для определения пути<icl Maps>.

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

Pragmatical Aspects of Map Traits

С прагматической точки зрения пары значений, которые несут<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>общего набора ключей, чтобы, скажем, синхронно повторяться по обеим картам, нам нужныобогатители.


PrevUpHomeNext

Статья Map Traits раздела Chapter 1. Boost.Icl Concepts может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Concepts ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:25:37/0.030667781829834/1