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

MultiArray Concept

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 25. Boost.MultiArray Reference Manual

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

MultiArray Concept

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

На каждом уровне (или измерении) контейнерной иерархии MultiArray лежит набор упорядоченных контейнеров, каждый из которых содержит одинаковое количество и тип значений. Глубина этой контейнерной иерархии - мультиаррейская размерность. MultiArray рекурсивно определяется; контейнеры на каждом уровне контейнерной иерархии модели MultiArray также. В то время как каждое измерение MultiArray имеет свой собственный размер, список размеров для всех измерений определяет форму всего MultiArray. На основании этой иерархии лежат 1-мерные Многоаррейсы. Их значения представляют собой содержащиеся в них объекты, представляющие интерес, а не часть иерархии контейнеров. Это элементы MultiArray.

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

MultiArray также определяет процедуры для создания специализированных взглядов. A view позволяет вам рассматривать подмножество основных элементов в MultiArray как отдельный MultiArray. Поскольку точка зрения относится к тем же основным элементам, изменения, внесенные в элементы обзора, будут отражены в оригинальном MultiArray. Например, при 3-мерном «кубе» элементов 2-мерный кусочек можно рассматривать как независимое Многоаррей. Просмотры создаются с использованием объектов index_gen и index_range. index_range обозначает элементы определенного измерения, которые должны быть включены в обзор. index_gen агрегированные данные варьируются и выполняют бухгалтерию для определения вида, который должен быть возвращен. MultiArray's operator [] должен быть передан результат N цепных вызовов index_gen::operator [], т.е.

indices[a0][a1]...[aN];

где N является размерностью MultiArray и индексы объект типа индекс_ген. Тип обзора зависит от количества дегенерированных размеров, указанных в index_gen. Дегенеративное измерение происходит, когда один индекс указывается на index_gen для определенного измерения. Например, если индекс является объектом типа индекс_ген, то следующий пример:

indices[index_range(0,5)][2][index_range(0,4)];

имеет вырожденное второе измерение. Вид, полученный из приведенной выше спецификации, будет иметь 2 измерения с формой 5 x 4. Если «2» выше был заменен другим index_range объект, например:

indices[index_range(0,5)][index_range(0,2)][index_range(0,4)];

затем вид будет иметь 3 измерения.

MultiArray экспортирует информацию о макете памяти ее содержащихся элементов. Его модель памяти для элементов полностью определяется 4 свойствами: происхождение, форма, индексные основы и достижения. Происхождение является адресом в памяти элемента, доступного как a[0][0].. [0], где a является MultiArray. Форма представляет собой список чисел, указывающих размер контейнеров в каждом измерении. Например, первая степень - размер самого внешнего контейнера, вторая - размер его подконтейнеров и так далее. Индексные базы - это список подписанных значений, указывающих индекс первого значения в контейнере. Все контейнеры в одном и том же измерении имеют одну и ту же индексную базу. Обратите внимание, что, поскольку положительные индексные базы возможны, происхождение не должно существовать для определения местоположения в памяти элементов MultiArray. Достижения определяют, как индексные значения сопоставляются с офсетами памяти. Они накапливают ряд возможных компоновок элементов. Например, элементы 2-мерного массива могут храниться в строке (т.е. элементы каждой строки хранятся непрерывно) или в столбце (т.е. элементы каждой колонны хранятся непрерывно).

Два класса проверки концепции MultiArray (ConstMultiArrayConcept и MutableMultiArrayConcept) находятся в пространстве name boost::multi_array_concepts в .

Notation

Ниже приведены описания символов, которые будут использоваться для описания интерфейса MultiArray.

Table 25.1. Notation

AТип, который является моделью MultiArray
a,bObjects of type A
NumDimsПараметр числового измерения, связанный с A.
ДимыНекоторые параметры числового измерения, такие как 0.
индексыОбъект, созданный некоторыми цепными звонками к index_gen::operator [] (index_range).
индекс_листAn object whose type models Collection
idxПодписанное интегральное значение.
tmpAn object of type boost::array<index,NumDims>

Associated Types

Table 25.2. Associated Types

TypeDescription
значение_типЭто тип значения контейнера. Если NumDims == 1, то это element. В противном случае, это тип значения немедленно вложенных контейнеров.
referenceЭто исходный тип содержащегося значения. Если NumDims == 1, то это element&. В противном случае, это тот же тип, что и шаблон субаррей ::type.
const_referenceЭто эталонный тип содержащегося значения. Если NumDims == 1, то это const element&. В противном случае, это тот же тип, что и шаблон const_subarray< NumDims-1>::type.
size_typeЭто неподписанный интегральный тип. Он в первую очередь используется для определения формы массива.
difference_typeЭто подписанный интегральный тип, используемый для представления расстояния между двумя итераторами. Это тот же тип, что и std::iterator_traits::difference_type.
итератор This is an iterator over the values of A. If NumDims == 1, then it models Random Access Iterator. Otherwise it models Random Access Traversal Iterator, Readable Iterator, Writable Iterator, and Output Iterator.
const_iteratorЭто расходный итератор над значениями A.
reverse_iteratorЭто обратный итератор, используемый для итерации назад по значениям A.
const_reverse_iteratorЭто обратный итератор. A.
элемент This is the type of objects stored at the base of the hierarchy of MultiArrays. It is the same as template subarray<1>::value_type
индексЭто подписанный интегральный тип, используемый для индексации на A. Он также используется для представления успехов и индексных баз.
index_genЭтот тип используется для создания тюпа index_range, переданного operator [] для создания объекта array_view::type.
index_rangeЭтот тип определяет ряд индексов по некоторым измерениям MultiArray. Этот диапазон будет виден через объект array_view::type.
Шаблон субаррей < Dims>::typeЭто субаррейный тип с размерами Dims. Это эталонный тип (NumDims - Dims) размерности A, а также модели MultiArray.
шаблон const_subarray::typeЭто тип подарка.
Шаблон массив_view< Dims>::typeЭто вид с размерами Dims. Он возвращается путем вызова оператор [] (индексы). Это модели MultiArray.
template const_array_view<Dims>::typeЭто тип точки зрения с размерами Dims.

Valid expressions

Table 25.3. Valid Expressions

ExpressionReturn typeSemantics
A::размерностьsize_typeЭта константа компиляции-времени представляет число измерений массива (примечание, что A::размерность == NumDims).
a.shape()const size_type*Это возвращает список элементов NumDims, указывающих степень каждого измерения массива.
a.strides()const index*Это возвращает список элементов NumDims, указывающих полосу, связанную с каждым измерением массива. При доступе к значениям, шаги используются для расчета местоположения элемента в памяти.
a.index_bases()const index*Это возвращает список элементов NumDims, указывающих цифровой индекс первого элемента для каждого измерения массива.
a.origin()element* if a is mutable, const element* otherwise. Это возвращает адрес элемента, доступного выражением a[0][0].. [0].. Если индексные основы являются положительными, этот элемент не будет существовать, но адрес все еще может быть использован для обнаружения действующего элемента с учетом его индексов.
a.num_dimensions()size_typeЭто возвращает число измерений массива (примечание, что a.num_dimensions() == NumDims).
a.num_elements()size_typeThis returns the number of elements contained in the array. It is equivalent to the following code:
std::accumulate(a.shape(),a.shape+a.num_dimensions(),
    size_type(1),std::multiplies<size_type>());
a.size()size_type This returns the number of values contained in a. It is equivalent to a.shape()[0];
a(индекс_лист)element&; if a is mutable, const element& otherwise. This expression accesses a specific element of a.index_list is the unique set of indices that address the element returned. It is equivalent to the following code (disregarding intermediate temporaries):
    // multiply indices by strides
    std::transform(index_list.begin(), index_list.end(),
      a.strides(), tmp.begin(), std::multiplies<index>()),
    // add the sum of the products to the origin
    *std::accumulate(tmp.begin(), tmp.end(), a.origin());
a.begin()iterator if a is mutable, const_iterator otherwise. Это возвращает итератор, указывающий на начало a.
a.end()iterator if a is mutable, const_iterator otherwise. Это возвращает итератор, указывающий на конец a.
a.rbegin()reverse_iterator if a is mutable, const_reverse_iterator otherwise. Это возвращает обратный итератор, указывающий на начало a.
a.rend()reverse_iterator if a is mutable, const_reverse_iterator otherwise. Это возвращает обратный итератор, указывающий на конец a.
a[idx]reference if a is mutable, const_reference otherwise. Это возвращает тип ссылки, который связан с индексом idx значения a. Обратите внимание, что если i является индексной базой для этого измерения, приведенное выше выражение возвращает (idx-i) элемент (счет от нуля). Выражение эквивалентно *(a.begin()+idx-a.index_bases()[0]);.
a[indices]array_view<Dims>::type if a is mutable, const_array_view<Dims>::type otherwise. Это выражение генерирует вид массива, определяемый значениями index_range и index, используемыми для построения indices.
a == bboolЭто выполняет лексикографическое сравнение значений a и b. Тип элемента должен модели EqualityComparable, чтобы это выражение было действительным.
a < bboolЭто выполняет лексикографическое сравнение значений a и b. Тип элемента должен модели LessThanComparable, чтобы это выражение было действительным.
a <=bboolЭто выполняет лексикографическое сравнение значений a и b. Тип элемента должен модели EqualityComparable и LessThanComparable, чтобы это выражение было действительным.
a > bboolЭто выполняет лексикографическое сравнение значений a и b. Тип элемента должен модели EqualityComparable и LessThanComparable, чтобы это выражение было действительным.
a >=bboolЭто выполняет лексикографическое сравнение значений a и b. Тип элемента должен модели LessThanComparable, чтобы это выражение было действительным.

Complexity guarantees

begin() and end() execute in amortized constant time. size() executes in at most linear time in the MultiArray's size.

Invariants

Table 25.4. Invariants

Диапазон проверки[a.begin(),a.end()) is a valid range.
Размер диапазонаa.size() == std::distance(a.begin(),a.end());.
ПолнотаИтерация через диапазон [a.begin(),a.end()) будет проходить через каждые value_type a.
Эквивалентностьa[a1][a2]...[aN] где N==NumDims дает тот же результат, что и a(index_list), где index_list является Collection, содержащим значения a1...aN.

Associated Types for Views

Следующие типы MultiArray определяют интерфейс для создания просмотров существующих MultiArray. Их интерфейсы и роли в концепции описаны ниже.

index_range

index_range объекты представляют полуоткрытые интервалы. Они агрегированы (с использованием объекта index_gen) и передаются мультиаррейскому оператору[1] для создания массивного обзора. При создании просмотра каждый index_range обозначает ряд действительных индексов по одному измерению MultiArray. Элементы, которые доступны через набор указанных диапазонов, будут включены в сконструированный вид. В некоторых случаях создается index_range без указания стартовых или конечных значений. В этих случаях объект интерпретируется, чтобы начаться в начале мультиаррейского измерения и закончиться в конце.

index_range objects can be constructed and modified several ways in order to allow convenient and clear expression of a range of indices. To specify ranges, index_range supports a set of constructors, mutating member functions, and a novel specification involving inequality operators. Using inequality operators, a half open range [5,10) can be specified as follows:

5 <= index_range() < 10;

или

4 < index_range() <= 9;

и так далее. Ниже описывается интерфейс index_range.

Table 25.5. Notation

iОбъект типа index_range.
idx,idx1,idx2,idx3Объекты типа индекс.

Table 25.6. Associated Types

TypeDescription
индексЭто подписанный интегральный тип. Он используется для указания значений старта, финиша и полосы.
size_typeЭто неподписанный интегральный тип. Он используется, чтобы сообщить размер диапазона, который представляет index_range.

Table 25.7. Valid Expressions

ExpressionReturn typeSemantics
index_range(idx1,idx2,idx3)index_rangeЭто создает индекс_range, представляющий интервал [idx1,idx2] с полосой idx3.
index_range(idx1,idx2)index_rangeЭто создает индекс_range, представляющий интервал [idx1,idx2] с узелом. Это эквивалентно index_range(idx1,idx2,1).
index_range()index_rangeЭта конструкция index_range с неопределенными стартовыми и финишными значениями.
i.start(idx1)индекс&Это устанавливает начальный индекс i на idx.
i.finish(idx)индекс&Это устанавливает индекс финиша i на idx.
i.stride(idx)индекс&Это устанавливает длину i на idx.
i.start()индексЭто возвращает начальный индекс i.
i.finish()индексЭто возвращает индекс финиша i.
i.stride()индексЭто возвращает длину полосы i.
i.get_start(idx)индексЕсли i указывает стартовое значение, это эквивалентно i.start(). В противном случае он возвращает idx.
i.get_finish(idx)индексЕсли i указывает итоговое значение, это эквивалентно i.finish(). В противном случае он возвращает idx.
i.size(idx)size_typeЕсли i указывает как итоговые, так и стартовые значения, это эквивалентно (i.finish()-i.start())/i.stride(). В противном случае он возвращает idx.
i < idxиндексThis is another syntax for specifying the finish value. This notation does not include idx in the range of valid indices. It is equivalent to index_range(r.start(), idx, r.stride())
i <=idxиндексThis is another syntax for specifying the finish value. This notation includes idx in the range of valid indices. It is equivalent to index_range(r.start(), idx + 1, r.stride())
idx < iиндексЭто еще один синтаксис для указания стартового значения. Эта нотация не включает idx в диапазон действительных индексов. Это эквивалентно index_range(idx + 1, i.finish(), i.stride()).
idx <=iиндексЭто еще один синтаксис для указания стартового значения. Эта нотация включает в себя idx1 в диапазоне действительных индексов. Это эквивалентно index_range(idx, i.finish(), i.stride()).
i + idxиндексЭто выражение меняет начальные и конечные значения i вверх на idx. Это эквивалентно index_range(r.start()+idx1, r.finish()+idx, r.stride())
i - idxиндексThis expression shifts the start and finish values of i up by idx. It is equivalent to index_range(r.start()-idx1, r.finish()-idx, r.stride())

index_gen

index_gen агрегаты index_range объектов для указания параметров обзора. Chained calls to operator [] store range and dimension information used to Instantiate a new view into a MultiArray.

Table 25.8. Notation

Димы, РангиНеподписанные интегральные значения.
xОбъект типа template gen_type::type.
iОбъект типа index_range.
idxОбъекты типа индекс.

Table 25.9. Associated Types

TypeDescription
индексЭто подписанный интегральный тип. Он используется для указания дегенератных размеров.
size_typeЭто неподписанный интегральный тип. Он используется, чтобы сообщить размер диапазона, который представляет index_range.
template gen_type::<Dims,Ranges>::typeЭтот тип генераторов имен результат Dims цепные звонки на index_gen::operator []. Обратите внимание, что index_gen и gen_type<0,0>::type имеют один и тот же тип.

Table 25.10. Valid Expressions

ExpressionReturn typeSemantics
index_gen()gen_type<0,0>::typeЭто создает объект index_gen. Затем этот объект может быть использован для создания tuples значений index_range.
x[i]gen_type<Dims+1,Ranges+1>::typeВозвращает новый объект, содержащий все предыдущие индекс_range объекты в дополнение к i. Цепные вызовы оператору [] являются средством, с помощью которого объекты index_range агрегированы.
x[idx]gen_type<Dims,Ranges+1>::typeDescription Обратите внимание, что это НЕ эквивалентно x[index_range(idx,idx)]., который вернет объект типа gen_type< Dims+1,Ranges+1>::type.

Models

  • multi_array
  • multi_array_ref
  • const_multi_array_ref
  • Шаблон массив_view< Dims>::type
  • Template const_array_view::type
  • Шаблон субаррей::type
  • шаблон const_subarray::type

PrevUpHomeNext

Статья MultiArray Concept раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 25. Boost.MultiArray Reference Manual может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 25. Boost.MultiArray Reference Manual ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 15:58:27/0.031603097915649/1