Выделение для многомерного массива, частично переменной длины, в переполнении стека

Допустим, у меня есть многомерный массив, который в C99 я мог бы написать так:

#define SIZE1 10
int size2;

[...]

int myArray[SIZE1][size2];

Хотя поддерживается несколькими компиляторами, это не является строго C ++ и не будет включен до C ++ 14.
Чтобы получить то же самое (кроме проблемы стека / кучи, не имеющей отношения к моему случаю) с использованием boost :: scoped_array, я пишу:

boost::scoped_array<int> myArray[SIZE1];
for (int i = 0; i < SIZE1; i++)
myArray[i].reset(new int[size2]);

Итак, не очень лаконичное выражение.
Я что-то упустил, или для многомерных массивов с переменной длиной не существует простого простого C ++ способа получить быстрое распределение?

Некоторая ссылка: Почему массивы переменной длины не являются частью стандарта C ++?

4

Решение

std::vector примет как размер, так и начальное значение, которое вы можете использовать для установки начального размера как внешнего, так и внутреннего вектора:

vector< vector<int> > myArray(SIZE1, vector<int>(size2));

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

boost::multi_array<int, 2> myArray(boost::extents[SIZE1][size2])
3

Другие решения

В стандарте C ++ нет многомерных массивов с переменной длиной, но вы можете легко написать свой собственный класс матрицы с вектором в нем, который вычисляет индекс вектора как «row_index * rowlength + column_index».

1

Если все, что вам нужно — это многомерный массив, вы можете использовать указатели, изменение размера потребует копирования в новый и удаления старого, но вы можете сделать следующее:

int** m;
int rows, cols;
cin >> rows >> cols;
m = new int* [rows];
for (int i = 0; i < rows; i++) {
m[i] = new int [cols];
}

for (int i = 0; i < rows; i++) {
delete [] m[i];
}
delete [] m;

или в качестве альтернативы вы можете использовать указатель на одномерный массив, такой как:

int* m;
int rows, cols;
cin >> rows >> cols;
m = new int [rows*cols];

и получить к нему доступ:

for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
m[i*cols+j] = i;

предоставление заявления об удалении:

delete [] m;
1

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

template <class T>
class Matrix
{
public:
Matrix(const unsigned int _width,const unsigned int _height)
:width(_width)
,height(_height)
{
elements.resize(width * height);//one allocation !
}
//x goes on width
//y on height
T&              get(const unsigned int x,const unsigned int y)
{
return elements[y * width + x];
}
public:
unsigned int    width;
unsigned int    height;
std::vector<T>  elements;
};

//usage:
Matrix<int> m(width_size,height_size);
m.get(10,10) = element;

Обратите внимание, что элементы размещены все в одном векторе и найти элемент в x а также y я использовал y * width + x получить индекс в векторе.

Также уже есть реализации для этой цели, поэтому было бы лучше взять один из Интернета. Ты можешь проверить форсированная библиотека за то, что у них там.

1
По вопросам рекламы [email protected]