Расширение динамически распределяемого массива - PullRequest
3 голосов
/ 20 октября 2010

Я выделил массив следующим образом.

#include <iostream>

int main() {
    const int first_dim = 3;
    const int second_dim = 2;

    // Allocate array and populate with dummy data
    int** myArray = new int*[first_dim];
    for (int i = 0; i < first_dim; i++) {
        myArray[i] = new int[second_dim];
        for (int j = 0; j < second_dim; j++) {
            myArray[i][j] = i*second_dim + j;
            std::cout << "[i = " << i << ", j = " << j << "] Value: " << myArray[i][j] << "\n";
        }
    }

    // De-allocate array
    for (int i = 0; i < first_dim; i++)
        delete[] myArray[i];
    delete[] myArray;
}

Допустим, я хочу добавить 4-й элемент в первое измерение, т. Е. myArray[3]. Возможно ли это?

Я слышал, что Векторы гораздо более эффективны для этой цели, но я едва знаю, что они, и я никогда не использовал их раньше.

Ответы [ 2 ]

5 голосов
/ 20 октября 2010

Да, но очень болезненно.Что вам нужно сделать, это выделить новую память, которая теперь имеет ваши новые желаемые измерения, в данном случае 4 и 2, затем скопировать все содержимое вашей матрицы в новую матрицу, а затем освободить память предыдущей матрицы ... этоболезненный.Теперь давайте посмотрим, как это делается с векторами:

#include <vector>
using std::vector;

int main()
{
   vector< vector <int> > matrix;
   matrix.resize(3);
   for(int i = 0; i < 3; ++i)
      matrix[i].resize(2);

   matrix[0][1] = 4;
   //...

   //now you want to make the first dimension 4? Piece of cake

   matrix.resize(4);
   matrix[3].resize(2);
}

HTH

edit: некоторые комментарии к вашему исходному коду:

  • В C ++ ALL_CAP_NAMES обычно ссылаются на макросы (что вы #define).Не используйте их в других контекстах
  • Почему вы объявляете FIRSTDIM и SECONDDIM статическими?Это абсолютно ненужно.Если локальная переменная является статической, это неофициально означает, что она будет той же самой переменной при следующем вызове функции с сохраненным значением.Поскольку технически вы не можете назвать main вторым, это бесполезно.Даже если бы вы могли это сделать, это все равно было бы бесполезно.
  • вы должны написать delete [] array[i]; и delete [] array;, чтобы компилятор знал, что int * и int **, которые вы пытаетесь удалить, фактически указывают намассив, а не просто int или int * соответственно.
2 голосов
/ 20 октября 2010

Допустим, я хочу добавить 4-й элемент в первое измерение, то есть myArray [3]. Возможно ли это?

Да, но это боль в шее. В основном все сводится к выделению нового массива, как это делает ваш существующий код (подсказка: поместите его в функцию и задайте аргументы размеров для этой функции) и скопируйте совместимые элементы поверх.

Редактировать : Одна из вещей, которые std::vector делает для вас, - правильно распределяет вашу память. В имеющемся коде сбой при выделении одного из массивов по второму измерению приведет к утечке памяти. Более надежное решение будет инициализировать указатели до 0 перед выполнением любого выделения. Блок исключения может затем перехватить исключение и освободить все, что было частично выделено.

Поскольку этот код быстро усложняется, люди прибегают к выделению одного буфера и адресации с использованием шага или с использованием одномерного массива одномерных массивов (т.е. std::vector из std::vector с).

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