Инициализация 2D-массива с динамическим количеством строк и фиксированным количеством столбцов.С++
-
27-09-2019 - |
Вопрос
У меня возникла проблема с созданием динамического 2D-массива на C++.Я хочу, чтобы у него был динамический номер (например.numR) «строк» и фиксированных (например.2) количество «столбцов».
Я попробовал сделать это так:
const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];
К сожалению, это не работает.Можно ли это сделать таким способом?
Конечно, я мог бы использовать double **myArray
и инициализировать его так, как если бы оба измерения были динамическими (с использованием numC в качестве ограничителя в цикле), но я бы хотел этого избежать, если это возможно.
Заранее спасибо.
Решение
Можно ли это сделать таким способом?
Да:
double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;
Это может показаться немного необычным, но в §5 5.3.4 четко сказано:
тип
new int[i][10]
являетсяint (*)[10]
Обратите внимание, что многие программисты не знакомы с синтаксисом декларатора C и не поймут этот код.Кроме того, динамическое распределение вручную не является безопасным для исключений.По этим причинам лучше использовать вектор массивов:
#include <vector>
#include <array>
std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary
Заменять std::array
с std::tr1::array
или boost::array
, в зависимости от вашего компилятора.
Другие советы
Почему бы не использовать станд::вектор, и воспользоваться его преимуществами конструктор:
std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
Должен быть цикл, так как вам нужно создать массив для каждого столбца.
Я думаю, что вам нужно:
double *myArray[numC];
for (int i = 0; i < numC; i++) {
myArray[i] = new double[numR];
}
// some code...
// Cleanup:
for (int i = 0; i < numC; i++) {
delete [] myArray[i];
}
Здесь объявляется массив указателей (на double
) с numC
элементов, затем создает массив из double
с numR
элементы для каждого столбца в myArray
.Не забудьте освободить память, когда закончите с ней, иначе возникнут утечки памяти.
Ваши индексы должны быть строками, а затем столбцами.
double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
myArray[i] = new double[numC];
}
Доступ к строке 2, столбцу 5:
myArray[2][5];