Boost C++: библиотека Multi_Array

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

Описание:

Dims Несколько числовых параметров измерения таких что 0
index_list Коллекция целочисленных значений (например std::vector или boost::array)
idx Целое число со знаком


Конструкторы и деструктор
template multi_array (); Создание нового экземпляра multi_array
template explicit multi_array(const ExtentList& sizes,const storage_order_type& store = c_storage_order(),const Allocator& alloc = Allocator()); sizes представляет форму нового multi_array, store представляет схему размещения измерений массива в памяти, alloc - распределитель памяти
template explicit multi_array(const extents_tuple& ranges,const storage_order_type& store = c_storage_order(),const Allocator& alloc = Allocator()); ranges представляет форму нового multi_array и базовые индексы для каждого измерения, store представляет схему размещения измерений массива в памяти, alloc - распределитель памяти
template multi_array(const multi_array& x); Набор копирующих конструкторов
template multi_array(const const_multi_array_ref& x);
template multi_array(const const_subarray::type& x);
template multi_array(const const_array_view::type& x);
template multi_array(const multi_array_ref& x);
template multi_array(const subarray::type& x);
template multi_array(const array_view::type& x);
~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::type operator[](indices)
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 void reshape(const SizeList& sizes); Изменяет форму multi_array Количество элементов и их базовые индексы остаются такими же, но количество значений каждого уровня контейнера может измениться
Замечание: SizeList должен быть контейнером (таким как std::vector или boost::array)
template typename void reindex(const BaseList& values); Изменяет базовые индексы multi_array согласно значениями в values
Замечание: BaseList должен быть контейнером (таким как std::vector или boost::array)
void reindex(index value); Изменяет базовые индексы во ВСЁМ multi_array на значение value
template typename void assign(InputIterator begin, InputIterator end); Копирует элементы из интервала [begin,end) в multi_array. Это эквивалентно std::copy(begin,end,this->data())
multi_array& resize(extent_gen::gen_type::type ranges); Функция изменяет форму multi_array согласно значениям в ranges. Данные сохраняются, но если новый массив меньше старого то чать данных теряется. Если новый массив больше старого то каждый новый элемент иннициализируется значением по умолчанию.
Операторы сравнения для multi_array
template bool operator==(const multi_array& x, const multi_array& y);
template bool operator!=(const multi_array& x, const multi_array& y);
template bool operator<(const multi_array& x, const multi_array& y);
template bool operator>(const multi_array& x, const multi_array& y);
template bool operator<=(const multi_array& x, const multi_array& y);
template bool operator>=(const multi_array& x, const multi_array& y);

Вспомогательные типы:

1. index_range

Представляет собой интервал значений.

Конструкторы
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())

2. index_gen

Хранит объекты index_range с целью определения параметров представления. Последовательность вызовов operator[] сохраняет информацию об интервалах и измерениях используемую для инстанцирования нового представления в multi_array

Dims,Ranges Целые числа без знака
template gen_type::::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::type operator[](index_range) Возвращает новый объект содержащий все предыдущие объекты index_range в дополнение к index_range, переданному в качестве параметра. Последовательный вызовы operator[] добавляют к уже имеющимся в объекте интервалам index_range новые объекты
gen_type::type operator[](idx) Возвращает новый объект содержащий все предыдущие объекты index_range в дополнение к вырожденному интервалу, index_range(idx,idx).
Замечание: Это НЕ эквивалентно x[index_range(idx,idx)]., которое возвращает объект типа gen_type::type


Глобальные объекты
indices Этот глобальный объект играет роль index_gen для всех компонентов массива предоставленных библиотекой
Пример использования: A[indices[index_range(0,5)][2][index_range(2,4)]];
extents Этот глобальный объект используется для настройки формы массива во время его конструирования
Пример использования: multi_array A(extents[3][3][3]);



Лучше закончить раздел небольшим примером:

#include "boost/multi_array.hpp"
#include

int main () {
// Создание 3D массива 3 x 4 x 2
  typedef boost::multi_array array_type;
  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;
}

библиотека BOOST C++ http://www.boost.org
с разрешения автора: перевод Сова Анатолий Романович http://www.aproxim.narod.ru

  © Mental Computing 2010