Для вашего конкретного случая использования вам, вероятно, лучше использовать 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()
.