<multi_index_container>инстанциации содержат один или несколько индексов, указанных во время компиляции. Каждый индекс позволяет получить доступ к элементам, содержащимся определенным образом. Например,упорядоченные индексыобеспечивают заданный интерфейс к элементам, тогда каксеквенированные индексыимитируют функциональность<std::list>.
Индексы не являются изолированными объектами и поэтому не могут быть построены сами по себе. Вместо этого они встраиваются в<multi_index_container>, как указано с помощьюуказателя индекса. Название правильной реализации индексного класса никогда не подвергается непосредственному воздействию пользователя, который имеет доступ только к соответствующему указателю индекса.
Вставка и стирание элементов всегда выполняются через соответствующий интерфейс некоторого индекса<multi_index_container>; эти операции, однако, оказывают влияние и на все другие индексы: например, вставка через данный индекс может потерпеть неудачу, поскольку существует другой индекс, который запрещает операцию, чтобы сохранить ее инвариантность (например, уникальность элементов). Это обстоятельство, вместо того, чтобы быть препятствием, дает большую часть силы Роста. MultiIndex: эквивалентные конструкции, основанные на ручном составе стандартных контейнеров, должны будут добавить достаточное количество кода, чтобы глобально сохранить инварианты каждого контейнера, гарантируя, что все они синхронизированы. Глобальные операции, выполняемые совместно между различными индексами, могут быть сведены к шести примитивам:
, в том числе, и в том, что касается грузовых автомобилей, грузовых автомобилей, грузовых автомобилей, грузовых автомобилей, грузовых автомобилей и т.д.
стержневые знаки и знаки стержневого знака.
торможение два на торможение оргкомитета: торможение на оргкомитете, линчевание на оргкомитете< [34] >. Для того, чтобы снять напряжение, для того, чтобы снять напряжение, для того, чтобы изменить ситуацию. ii) налаживания взаимодействия между отделами и хештегами, а именно: налаживания взаимодействия и взаимодействия с контейнерами, и налаживания контактов с ними; налаживания взаимодействия с дисконтированными устройствами и наведением мостов, устройств< [35] >.
вставить элемент,
подсказанная вставка, в которой предлагается существующий элемент для повышения эффективности операции,
удаление элемента,
замена значения элемента, которая может вызвать перегруппировку этого элемента в одном или нескольких индексах, или запрет замены,
modification of an element, and its subsequent
rearrangement/banning by the various indices.
The last two primitives deserve some further explanation: in order to
guarantee the invariants associated to each index (e.g. some definite
ordering,) elements of a multi_index_container are not mutable.
To overcome this restriction, indices expose member functions
for replacement and modification which allow for the mutation of elements
in a controlled fashion. Immutability of elements does not significantly
impact the interfaces of ordered and hashed indices, as they are based upon
those of associative and unordered associative containers, respectively,
and these containers
also have non-mutable elements; but it may come as a surprise when dealing
with sequenced and random access indices, which are designed upon the functionality provided
by std::list.
[ORIG_END] -->
Эти глобальные операции не подвергаются непосредственному воздействию пользователя, а, скорее, они обернуты соответствующим образом каждым индексом (например, упорядоченные индексы обеспечивают набор функций вставки, в то время как индексы секвенированного и случайного доступа имеют операции<push_back>и<push_front>). Повышаю. MultiIndex не создает особых условий на интерфейсе индексов, хотя каждый индекс удовлетворяет требованиям C++ для стандартных контейнеров в максимально возможной степени в концептуальных рамках библиотеки.
Некоторые функции индексного интерфейса реализуются глобальными примитивами из списка выше. Таким образом, сложность этих операций зависит от всех индексов данного<multi_index_container>, а не только от используемого в настоящее время индекса.
Для установления оценок сложности индекс характеризуется егосигнатурой сложности, состоящей из следующих связанных функций по количеству элементов:
<c(n)>: копирование,
<i(n)>: вставка,
<h(n)>: подсказанная вставка,
<d(n)>: удаление,
<r(n)>: замена,
<m(n)>: модификация.
Each function yields the complexity estimate of the contribution of the index
to the corresponding global primitive. Let us consider
an instantiation of multi_index_container
with N indices labelled 0,...,N-1
whose complexity signatures are
(ci,ii,hi,di,ri,mi);
the insertion of an element in such a container is then of complexity
O(i0(n)+···+iN-1(n)) where n
is the number of elements. To abbreviate notation, we adopt the
following definitions:
C(n)=c0(n)+···+cN-1(n),
I(n)=i0(n)+···+iN-1(n),
H(n)=h0(n)+···+hN-1(n),
D(n)=d0(n)+···+dN-1(n),
R(n)=r0(n)+···+rN-1(n),
M(n)=m0(n)+···+mN-1(n).
For instance, consider a multi_index_container with two ordered indices,
for which i(n)=log(n), and a sequenced index with i(n)=1
(constant time insertion). Insertion of an element into this multi_index_container
is then of complexity
Указатели индексов передаются в качестве аргументов для<multi_index_container>и предоставляют информацию, необходимую для включения соответствующих индексов. Будущие выпуски Boost. MultiIndex может обеспечивать спецификацию определяемых пользователем индексов. Между тем требования к индексному спецификатору остаются установленными. В настоящее время Boost.MultiIndex предоставляет указатели индексов
<indexed_by>является моделью<MPL Random Access Sequence>и<MPL Extensible Sequence>, предназначенной для использования для указания списка индексов на время компиляции в качестве<IndexSpecifierList><multi_index_container>.
Каждый предоставленный пользователем элемент<indexed_list>должен быть указателем индекса. По крайней мере, элемент должен быть предоставлен. Определено максимальное количество элементов последовательности<indexed_by>.
Теги являются обычными типами, используемыми в качестве мнемоники для индексов<multi_index_container>, как, например, в функции члена<get>. Каждый индекс не может иметь ни одного, одного или нескольких связанных тегов. Способ, которым теги присваиваются данному индексу, зависит от конкретного указателя индекса. Однако для удобства все индексы Boost. MultiIndex поддерживает тегирование через шаблон класса<tag>.
<tag>представляет собой конструкцию списка типов, используемую для указания последовательности тегов времени компиляции, которая должна быть назначена индексу во время инстанциации.
Элементы<tag>могут быть любого типа, хотя ожидается, что пользователь предоставит классам мнемонические имена. Дублирующие элементы не допускаются. Определено максимальное количество элементов<tag>инстанциации. Вложенная<type>является моделью<MPL Random Access Sequence>и<MPL Extensible Sequence>, содержащей типы<T0>, ...,<Tn>в том же порядке, что и указано.
Упорядоченные индексысортируют элементы на ключе и обеспечивают быстрый поиск капабилитов.
Ранжированные индексыпредставляют собой вариацию упорядоченных индексов, обеспечивающих дополнительные операции на основеранга, численного положения элемента в последовательности.
Индексы хешированияобеспечивают высокую эффективность доступа с помощью методов хеширования.
Приведенная ниже концепция используется для перегруппировки объектов неключевых индексов. Учитывая индекс<i>типа<Index>,вид<i>представляет собой любой диапазон [<first>,<last>), где<first>и<last>являются входными итераторами, так что
Обратите внимание, что вид относится к фактическим элементам<i>, а не к их копиям. Кроме того, считается, что видсвободен, если на его порядок прохождения не влияют изменения порядка прохождения<i>. Примерами свободных просмотров являются:
[< [146] >,< [147] >],< [148] >— в контейнере [беркт] сау (отBoost.Ref)] сау< [149] >, с прим.
Связанный типIteratorможет быть преобразован вconst Index::value_type&.
Каждый из элементовiпоявляется ровно один раз вfirst,last.
Note that the view refers to the actual elements of i, not to
copies of them. Additionally, a view is said to be free if its traversal
order is not affected by changes in the traversal order of i.
Examples of free views are:
[c.begin(),c.end()], гдеc— любой контейнер эталонных оберток (отBoost.Ref) до элементовi, содержащих ровно одну ссылку на каждый элемент.
i'.begin(),i'.end(), гдеi'— любой индекс, принадлежащий тому жеmulti_index_container, что иi, за исключением самогоi.
Любой диапазон, который является перестановкой описанных выше, напримерc.rbegin(),c.rend(), или диапазоны, полученные от первого с помощьюpermutation_iteratorот Boost. Итератор.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.