2015-06-30 6 views
0

Так я определить указатель х указывая на п целых чисел, как:Динамическое распределение 2D массива в C++

int* x = new int [n]; 

Значения х изменения в цикле. В конце цикла хранить указатель х в 2D-указателе у, который был инициализирован, как:

int** y = new int* [n]; 

Я использую следующее выражение присваивания для хранения указателя на х в Ith элемент у:

y[i] = x; 

с х указывает на одной и той же части памяти, но значения, хранящиеся в x, продолжают меняться, все элементы в 2D-массиве y будут получать последние значения, которые были сохранены в x во время последнего выполнения цикла.

Мой вопрос:

Есть в любом случае я могу отвязать х, откуда он был направлен и чтобы она указывала на новую часть памяти каждый раз, когда я хранить его адрес в у ? Таким образом, y хранит адрес в разных частях памяти, поэтому сохраняется история ответов, хранящихся в x. Также, пожалуйста, дайте мне знать, если этот метод (если это вообще возможно) быстрее, чем заполнение строк y с x на каждой итерации путем циклизации его элементов.

+0

У вас может быть x новый массив std :: с n int, и я думаю, что это даст вам «unlink», за которым вы после. И вы могли бы выделить n из них для хранения в другом std :: array y. Если вы хотите наклониться к C, вы можете просто malloc другой массив x каждый раз, когда вы готовы сделать еще одну запись y. Но я склоняюсь к std :: array. – donjuedo

+1

вы используете C++ - рассмотрите использование 'std :: vector' типов' std :: vector'. – Alnitak

ответ

0

Если мое понимание верное, вы хотите сохранить историю всех значений массива x внутри y.

Что вы предлагаете, на самом деле невозможно, не заполняя строки y с x на каждой итерации.

Что вы можете сделать, это предустановить, чтобы у вас не было нового распределения внутри цикла, у вас есть это перед циклом (вы все равно сделаете копию).

Стоимость памяти все равно будет n^2, и так будет сложной.

// without preallocation 
    { 
    int** y = new int*[n]; 
    int* oldx=0; 
    for (int i=0;i<n;i++) 
    { 
     int* x = new int[n]; 
     // migrate old values in case you are modifying just a part of x 
     if (oldx!=0) 
     { 
      memcpy(x,oldx,n*sizeof(int)); 
     } 
     //... do some stuff with x; 
     y[i] = x; 
     // keep reference to copy in next iteration 
     oldx=x; 
    } 
    } 

    // with preallocation 
    { 
    int ** y = new int*[n]; 
    // preallocate memory 
    for (int i=0;i<n;i++) 
    { 
     y[i] = new int[n]; 
    } 
    int* oldx=0; 
    for (int i=0;i<n;i++) 
    { 

     int* x =y[i]; 
     // migrate old values in case you are modifying just a part of x 
     if (oldx!=0) 
     { 
      memcpy(x,oldx,n-sizeof(int)); 
     } 
     // ... do stuff with x 
     // keep reference to copy in next iteration 
     oldx = x; 
    } 
    } 
0

Что касается того, что быстрее, я не могу сказать ... Я предлагаю вам попробовать и настроить прототипы каждого подхода. Что касается переустановки x, вы можете использовать:

x = new int[n]; 

Надеюсь, это поможет.

Смежные вопросы