Как использовать (Boost Multi -размерная библиотека массивов) для создания динамического двумерного массива? - PullRequest
5 голосов
/ 29 апреля 2011

Мне нужна помощь в использовании многомерного массива boost.Мне нужно построить двумерный массив, где: (0 <= j <= 1) и (i) динамически растут в соответствии с: </p>

long boostArray[i][j];

Таким образом, это похоже на построение таблицы (неизвестных) столбцов идва ряда.

Я уже начал с примера, представленного на веб-сайте Boost Library:

#include "boost/multi_array.hpp"
#include <cassert>

int main () {
  // 3 x 4 x 2 
  typedef boost::multi_array<double, 3> 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 Library, особенно если этот массив растет динамически, как я описал выше.

Например, при работе с векторами я склонен использовать: push_back и pop_back после изменения размера вектора.

1 Ответ

2 голосов
/ 29 апреля 2011

Для вашего конкретного случая использования вам, вероятно, лучше использовать vector<pair<T,T>> или vector<array<T,2>>.Затем вы можете использовать push_back, и это эффективно.boost::multi_array звучит как излишнее, otoh:

Вы не можете использовать там что-то вроде push_back, потому что всякий раз, когда вы расширяете одно измерение N -мерного массива, вам необходимо предоставить срезN-1 размеры исходных данных.Это обычно не очень эффективно, особеннотак как вы можете добавить только измерение с наибольшим шагом.Вместо этого вам нужно использовать resize и присваивание.

// std::vector<> equivalent (with vector<>, it's considered bad style)
v.resize( v.size() + 1 );
v[v.size()-1] = newElement;

// boost::multi_array (from the tutorial)
typedef boost::multi_array<int, 3> array_type;

array_type::extent_gen extents;
array_type A(extents[3][3][3]);
A[0][0][0] = 4;
A[2][2][2] = 5;
// here, it's the only way:
A.resize(extents[2][3][4]);
assert(A[0][0][0] == 4);
// A[2][2][2] is no longer valid.

Повторим: N -мерные массивы N>2 по своей природе гораздо менее динамичны, чем одномерные (из-зафактор шага).Вышеуказанное изменение размера требует большого копирования данных, в отличие от случая вектора, который требуется копировать только при size()>capacity().

...