Инициализация 2D массива с динамическим количеством строк и фиксированным количеством столбцов. C ++ - PullRequest
3 голосов
/ 23 ноября 2010

У меня проблема с созданием 2D-динамического массива в C ++.Я хочу, чтобы он имел динамическое число (например, numR) «строк» ​​и фиксированное (например, 2) число «столбцов».

Я пытался сделать это так:

const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];

К сожалениюне работаетМожно ли сделать это таким образом?

Конечно, я мог бы использовать double **myArray и инициализировать его так, как если бы оба измерения были динамическими (с использованием numC в качестве ограничителя в цикле), но я хотел бы избежать этого, если это возможно.

Спасибо ввперед.

Ответы [ 4 ]

6 голосов
/ 23 ноября 2010

Можно ли сделать это таким образом?

Да:

double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;

Это может выглядеть немного необычно, но 5.3.4 §5ясно говорится:

тип 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, в зависимости от вашего компилятора.

2 голосов
/ 23 ноября 2010

Почему бы не использовать std :: vector и воспользоваться его конструктором :

std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
1 голос
/ 23 ноября 2010

Должен быть цикл, так как вам нужно создать массив для каждого столбца .

Я думаю, что вы ищете:

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 s с numR элементами для каждого столбца в myArray. Не забудьте освободить память, когда закончите с ней, иначе у вас будут утечки памяти.

0 голосов
/ 23 ноября 2010

Ваши индексы должны быть строкой, а затем столбцом.

double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
    myArray[i] = new double[numC];
}

Доступ к строке 2, столбец 5:

myArray[2][5];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...