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

Auxiliary Components

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

Auxiliary Components

multi_array_types

namespace multi_array_types {
  typedef *unspecified* index;
  typedef *unspecified* size_type;
  typedef *unspecified* difference_type;
  typedef *unspecified* index_range;
  typedef *unspecified* extent_range;
  typedef *unspecified* index_gen;
  typedef *unspecified* extent_gen;
}

Пространство имен multi_array_types определяет типы, связанные с multi_array, multi_array_ref и const_multi_array_ref, которые не зависят от параметров шаблона. Эти типы находят общее применение со всеми. Многомерные компоненты. Они определены в пространстве имен, из которого они могут быть легко доступны. За исключением extent_gen и extent_range, эти типы выполняют роли одного и того же имени, требуемые MultiArray, и описаны в его определении понятия. extent_gen и extent_range описаны ниже.

extent_range

extent_range объекты определяют полуоткрытые интервалы. Они предоставляют информацию о форме и индексе для конструкторов multi_array, multi_array_ref и const_multi_array_ref. extent_range передаются в совокупности конструктору массивов (более подробную информацию см. в extent_gen).

Synopsis. 

class extent_range {
public:
  typedef multi_array_types::index      index;
  typedef multi_array_types::size_type  size_type;
  // Structors
  extent_range(index start, index finish);
  extent_range(index finish);
  ~extent_range();
  // Queries
  index start();
  index finish();
  size_type size();
};

Модель Of. DefaultConstructible

Методы и типы. 

extent_range(index start, index finish)

This constructor defines the half open interval [start,finish). The expression finish must be greater than start.

extent_range(index finish)

Этот конструктор определяет полуоткрытый интервал [0,финиш]. Значение finish должно быть положительным.

index start()

Эта функция возвращает первый индекс, представленный диапазоном

index finish()

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

size_type size()

Эта функция возвращает размер указанного диапазона. Это эквивалентно finish()-start().

extent_gen

Класс extent_gen определяет интерфейс для агрегирования формы массива и индексирования информации, передаваемой конструктору multi_array, multi_array_ref или const_multi_array_ref. Его интерфейс имитирует синтаксис, используемый для объявления встроенных типов массивов в C++. Например, в то время как 3-мерный массив значений int в C++ будет объявлен как:

int A[3][4][5],

аналогичный multi_array будет объявлен:

multi_array<int,3> A(extents[3][4][5]).

Synopsis. 

template <std::size_t NumRanges>
class *implementation_defined* {
public:
  typedef multi_array_types::index index;
  typedef multi_array_types::size_type size_type;
  template <std::size_t NumRanges> class gen_type;
  gen_type<NumRanges+1>::type  operator[](const range& a_range) const;
  gen_type<NumRanges+1>::type  operator[](index idx) const;
};
typedef *implementation_defined*<0> extent_gen;

Методы и типы. 

template gen_type<Ranges>::type

Этот тип генератора используется для указания результата Ranges Привязка вызовов к extent_gen::operator[]. Типы extent_gen и gen_type::type одинаковы.

gen_type<NumRanges+1>::type operator[](const extent_range& a_range) const;

Эта функция возвращает новый объект, содержащий все предыдущие объекты extent_range в дополнение к a_range. extent_range объекты агрегируются цепными вызовами оператору[].

gen_type<NumRanges+1>::type operator[](index idx) const;

Эта функция возвращает новый объект, содержащий все предыдущие объекты extent_range в дополнение к extent_range(0,idx). Эта функция дает конструкторам массивов аналогичный синтаксис традиционной многомерной декларации массива C.

Global Objects

Для синтаксического удобства Boost.MultiArray определяет два глобальных объекта как часть своего интерфейса. Эти объекты играют роль генераторов объектов; вовлекающие их выражения создают другие объекты, представляющие интерес.

При некоторых обстоятельствах два глобальных объекта могут считаться чрезмерными накладными расходами. Их конструкцию можно предотвратить, определив символ препроцессора BOOST_MULTI_ARRAY_NO_GENERATORS перед включением boost/multi_array.hpp.

extents

namespace boost {
  multi_array_base::extent_gen extents;
}

Повышаю. Классы массивов MultiArray используют глобальный объект extents для определения формы массива во время их строительства. Например, 3 на 3 на 3 multi_array построен следующим образом:

multi_array<int,3> A(extents[3][3][3]);

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

indices

namespace boost {
  multi_array_base::index_gen  indices;
}

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

Например, с помощью объекта indices вид массива A сконструирован следующим образом:

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

View and SubArray Generators

Повышаю. MultiArray предоставляет классы признаков subarray_gen, const_subarray_gen, array_view_gen и const_array_view_gen для именования типов, связанных с массивом, в шаблонах функций. В целом это не более удобно для использования, чем генераторы вложенного типа, но автор библиотеки обнаружил, что некоторые компиляторы C++ неправильно обрабатывают шаблоны, вложенные в типы параметров шаблона функции. Эти генераторы представляют собой обходной путь для этого дефицита. Следующий фрагмент кода иллюстрирует соответствие между классом признаков array_view_gen и классом array_view Тип, связанный с массивом:

template <typename Array>
void my_function() {
  typedef typename Array::template array_view<3>::type view1_t;
  typedef typename boost::array_view_gen<Array,3>::type view2_t;
  // ...
}

В приведенном выше примере view1_t и view2_t имеют одинаковый тип.

Memory Layout Specifiers

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

Например, рассмотрим двухмерный массив, показанный ниже в матричных обозначениях:

Вот как вышеупомянутый массив выражается в C++:

int a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

Это пример хранения строк, где элементы каждой строки хранятся сопряжённо. В то время как C++ прозрачно обрабатывает доступ к элементам массива, вы также можете управлять массивом и его индексацией вручную. Один из способов выразить это в памяти заключается в следующем:

int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
int s[] = { 4, 1 };

С последней декларацией a и шагами s можно получить доступ к элементу a(i,j) массива с помощью выражения

*a+i*s[0]+j*s[1]

.

Один и тот же двухмерный массив может быть выложен колонкой следующим образом:

int a[] = { 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11 };
int s[] = { 3, 1 };

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

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

int data[] = { 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3 };
int *a = data + 8;
int s[] = { -4, 1 };

Обратите внимание, что в этом примере a должно быть явно установлено происхождение. В предыдущих примерах первым элементом, хранящимся в памяти, было происхождение; здесь это уже не так.

В качестве альтернативы, второе измерение или столбцы могут быть обращены вспять, и строки хранятся в порядке возрастания:

int data[] = { 3, 2, 1, 0,  7, 6, 5, 4, 11, 10, 9, 8 };
int *a = data + 3;
int s[] = { 4, -1 };

Наконец, оба измерения могут храниться в порядке убывания:

int data[] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int *a = data + 11;
int s[] = { -4, -1 };

Все вышеперечисленные значения эквивалентны. Выражение, приведенное выше для a(i,j), дает одинаковое значение независимо от компоновки памяти. Повышаю. Массивы MultiArray могут быть созданы с настраиваемыми параметрами хранения, как описано выше. Таким образом, существующие данные могут быть адаптированы (с multi_array_ref или const_multi_array_ref) в соответствии с абстракцией массива. Распространенным использованием этой функции будет обертывание массивов, которые должны взаимодействовать с рутинами Fortran, чтобы ими можно было естественно манипулировать как на уровне C++, так и на уровне Fortran. Следующие разделы описывают рост. Компоненты MultiArray используются для определения макета памяти.

c_storage_order

class c_storage_order {
  c_storage_order();
};

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

fortran_storage_order

class fortran_storage_order {
  fortran_storage_order();
};

fortran_storage_order используется для указания того, что массив должен хранить свои элементы с использованием той же компоновки памяти, что и многомерный массив Fortran, то есть от первого измерения до последнего.

general_storage_order

template <std::size_t NumDims> 
class general_storage_order {
  template <typename OrderingIter, typename AscendingIter>
  general_storage_order(OrderingIter ordering, AscendingIter ascending);
};

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

OrderingIter и AscendingIter должны смоделировать концепцию InputIterator. Оба итератора должны относиться к диапазону элементов NumDims. AscendingIter указывает на объекты, конвертируемые в bool. Значение true означает, что измерение хранится в порядке возрастания, а false означает, что измерение хранится в порядке убывания. OrderingIter определяет порядок, в котором хранятся размеры.

Range Checking

По умолчанию способы доступа к массиву оператор() и оператор[] выполняют проверку диапазона. Если поставляемый индекс находится вне диапазона, определенного для массива, утверждение прервет программу. Чтобы отключить проверку диапазона (по причинам производительности в производственных выпусках), определите макрос препроцессора BOOST_DISABLE_ASSERTS до включения multi_array.hpp в приложение.


PrevUpHomeNext

Статья Auxiliary Components раздела 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 16:40:18/0.0087089538574219/0