Инициализация 2D-массива с динамическим количеством строк и фиксированным количеством столбцов.С++

StackOverflow https://stackoverflow.com/questions/4256817

Вопрос

У меня возникла проблема с созданием динамического 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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top