Допустим, у меня есть многомерный массив, который в 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 ++?
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])
В стандарте C ++ нет многомерных массивов с переменной длиной, но вы можете легко написать свой собственный класс матрицы с вектором в нем, который вычисляет индекс вектора как «row_index * rowlength + column_index».
Если все, что вам нужно — это многомерный массив, вы можете использовать указатели, изменение размера потребует копирования в новый и удаления старого, но вы можете сделать следующее:
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;
Для этого нет контейнера по умолчанию, вам нужно написать один если вы хотите только одно выделение. Это самый короткий пример, который я могу привести:
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
получить индекс в векторе.
Также уже есть реализации для этой цели, поэтому было бы лучше взять один из Интернета. Ты можешь проверить форсированная библиотека за то, что у них там.