Данный класс представляет собой многомерный контейнер который поддерживает итераторы с произвольным доступом.
Количество элементов во время существования контейнера остаётся неизменным, но его форма может быть изменена.
Контейнер хранит элементы с использованием заменяемого распределителя памяти. Разработан Рональдом Гарсиа.
Описание:
| Dims |
Несколько числовых параметров измерения таких что 0 |
| index_list | Коллекция целочисленных значений (например std::vector или boost::array) |
| idx | Целое число со знаком |
| Конструкторы и деструктор | |
|---|---|
|
template multi_array | Создание нового экземпляра multi_array |
|
template | sizes представляет форму нового multi_array, store представляет схему размещения измерений массива в памяти, alloc - распределитель памяти |
|
template | ranges представляет форму нового multi_array и базовые индексы для каждого измерения, store представляет схему размещения измерений массива в памяти, alloc - распределитель памяти |
|
template |
Набор копирующих конструкторов |
|
template | |
|
template | |
|
template | |
|
template | |
|
template | |
|
template | |
| ~multi_array(); | Деструктор |
| Итераторы | |
|
iterator begin(); const_iterator begin() const; | Представляют соответственно неконстантный и константный итераторы для первого элемента multi_array |
|
iterator end(); const_iterator end() const; | Представляют соответственно неконстантный и константный итераторы для конечного элемента multi_array |
| Обратные итераторы | |
|
iterator rbegin(); const_iterator rbegin() const; | Представляют соответственно обратные неконстантный и константный итераторы для первого элемента multi_array |
|
iterator rend(); const_iterator rend() const; | Представляют соответственно обратные неконстантный и константный итераторы для конечного элемента multi_array |
| Ёмкость multi_array | |
| size_type size(); |
Возвращает количество значений multi_array Это эквивалентно shape()[0]; |
| size_type num_dimensions(); | Возвращает количество измерений в multi_array |
| size_type num_elements(); | Возвращает количество элементов в multi_array |
| const size_type* shape(); | Возвращает указатель на массив целочисленных значений, содержащих протяжённость каждого измерения multi_array |
| const index* strides(); |
Возвращает указатель на массив целочисленных значений, содержащих шаг, ассоциированный с каждым измерением multi_array Шаги используются для вычисления расположения элементов в памяти |
| const index* index_bases(); | Возвращает указатель на массив целочисленных значений, содержащих базовые индексы для каждого измерения multi_array |
|
element* origin(); const element* origin(); | Возвращает адрес элемента с индексом [0][0]...[0].. Если базовые индексы позитивные то такой элемент не будет существовать, но адрес может использоваться для определения существующего элемента с использованием его индексов |
|
element* data(); const element* data(); | Возвращает указатель на массив значений multi_array. Если все базовые индексы еулевые это эквивалентно origin() |
| storage_order_type& storage_order() const; | Возвращает объект, который формирует порядок объектов, ассоциированный с multi_array. Этот объект может быть использован для конструирования нового multi_array с тем же самым порядком хранения элементов |
| Доступ к элементам multi_array | |
|
reference operator[](idx); const_reference operator[](idx) const; |
Возвращает элемент с индексом idx Замечание: Даже если базовый индекс i положительный то все равно будет возвращён (idx-i)-й элемент (отсчёт начинается с нуля) |
|
array_view const_array_view::type operator[](indices) const; | Данное выражение генерирует представление массива, определённого с помощью значений index_range и index при конструировании indices |
|
element& operator()(index_list); const element& operator()(index_list)с | Возвращает ссылку на элемент с индексами указанными в коллекции index_list |
| Модификаторы multi_array | |
|
template |
Изменяет форму multi_array Количество элементов и их базовые индексы остаются такими же, но количество значений каждого уровня контейнера может измениться Замечание: SizeList должен быть контейнером (таким как std::vector или boost::array) |
|
template typename |
Изменяет базовые индексы multi_array согласно значениями в values Замечание: BaseList должен быть контейнером (таким как std::vector или boost::array) |
| void reindex(index value); | Изменяет базовые индексы во ВСЁМ multi_array на значение value |
|
template typename | Копирует элементы из интервала [begin,end) в multi_array. Это эквивалентно std::copy(begin,end,this->data()) |
|
multi_array& resize(extent_gen::gen_type | Функция изменяет форму multi_array согласно значениям в ranges. Данные сохраняются, но если новый массив меньше старого то чать данных теряется. Если новый массив больше старого то каждый новый элемент иннициализируется значением по умолчанию. |
| Операторы сравнения для multi_array | |
|
template | |
|
template | |
|
template | |
|
template | |
|
template | |
|
template | |
Вспомогательные типы:
Представляет собой интервал значений.
| Конструкторы | |
|---|---|
| index_range(idx1,idx2,idx3) | Создаёт index_range с интервалом [idx1,idx2) с шагом idx3 |
| index_range(idx1,idx2) | Создаёт index_range с интервалом [idx1,idx2) с шагом 1 |
| index_range() | Создаёт index_range с неопределёнными началом и концом |
| Прочие операции | |
| index& start(idx) | Устанавливает начальный индекс index_range в idx |
| index& finish(idx) | Устанавливает конечный индекс index_range в idx |
| index& stride(idx) | Устанавливает шаг index_range в idx |
| index start() | Возвращает начальный индекс index_range |
| index finish(idx) | Возвращает конечный индекс index_range |
| index stride(idx) | Возвращает шаг index_range |
| index get_start(idx) | Если определён начальный индекс то возвращается start(), иначе возвращается idx |
| index get_finish(idx) | Если определён начальный индекс то возвращается finish(), иначе возвращается idx |
| size_type size(idx) | Если определены начальные и конечные индексы то возвращается (finish()-start())/stride(), иначе возвращается idx |
| index i < idx |
Альтернативный синтаксис для установки конечного индекса Эквивалентно index_range(r.start(), idx, r.stride()) |
| index i <= idx |
Альтернативный синтаксис для установки конечного индекса Эквивалентно index_range(r.start(), idx + 1, r.stride()) |
| index idx < i |
Альтернативный синтаксис для установки начального индекса Эквивалентно index_range(idx + 1, i.finish(), r.stride()) |
| index idx <= i |
Альтернативный синтаксис для установки начального индекса Эквивалентно index_range(idx, i.finish(), r.stride()) |
| index i <= idx |
Сдвигает индексы index_range вправо на idx Эквивалентно index_range(r.start()+idx, r.finish()+idx, r.stride()) |
| index i <= idx |
Сдвигает индексы index_range влево на idx Эквивалентно index_range(r.start()-idx, r.finish()-idx, r.stride()) |
Хранит объекты index_range с целью определения параметров
представления. Последовательность вызовов operator[] сохраняет
информацию об интервалах и измерениях используемую для инстанцирования
нового представления в multi_array
| Dims,Ranges | Целые числа без знака |
|
template gen_type:: | Тип герерирует Dims последовательных вызовов index_gen::operator[]. Параметр Ranges определяется числом вырожденных интервалов (т.е. вызовами operator[](idx)). Замечание: Тип index_gen эквивалентен типу gen_type<0,0>::type |
| gen_type<0,0>::type index_gen() | Конструирует index_gen объект. Этот объект может использоваться для генерации кортежей для index_range значений |
|
gen_type | Возвращает новый объект содержащий все предыдущие объекты index_range в дополнение к index_range, переданному в качестве параметра. Последовательный вызовы operator[] добавляют к уже имеющимся в объекте интервалам index_range новые объекты |
|
gen_type | Возвращает новый объект содержащий все предыдущие
объекты index_range в дополнение к вырожденному интервалу,
index_range(idx,idx). Замечание: Это НЕ эквивалентно x[index_range(idx,idx)]., которое возвращает объект типа gen_type |
| Глобальные объекты | |
|---|---|
| indices |
Этот глобальный объект играет роль index_gen для всех компонентов массива предоставленных библиотекой Пример использования: A[indices[index_range(0,5)][2][index_range(2,4)]]; |
| extents |
Этот глобальный объект используется для настройки формы массива во время его конструирования Пример использования: multi_array |
библиотека BOOST C++
http://www.boost.org
Лучше закончить раздел небольшим примером:
#include "boost/multi_array.hpp"
#include
int main () {
// Создание 3D массива 3 x 4 x 2
typedef boost::multi_array
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);
// Присвоение значений элементам
int values = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
A[i][j][k] = values++;
// Проверка значений
int verify = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
assert(A[i][j][k] == verify++);
return 0;
}
с разрешения автора: перевод
Сова Анатолий Романович
http://www.aproxim.narod.ru