2010-10-20 5 views
3

J'ai affecté un tableau comme suit.Développement d'un tableau alloué dynamiquement

#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; 
} 

Disons que je veux ajouter un 4ème élément à la première dimension, à savoir myArray[3]. Est-ce possible? J'ai entendu dire que les vecteurs sont beaucoup plus efficaces à cet effet, mais je ne sais pas ce qu'ils sont et je ne les ai jamais utilisés auparavant.

+2

avez-vous essayé d'utiliser 'std :: vector'? On dirait que cela pourrait mieux convenir à vos besoins. –

+1

Indépendamment des vecteurs (que vous devriez probablement utiliser dans ce cas), vous auriez dû utiliser delete [] au lieu de delete dans les deux cas, puisque vous avez alloué un tableau. – Asaf

+0

L'utilisation de vecteurs n'est pas une tâche très difficile. –

Répondre

5

Oui, mais d'une manière très douloureuse. Ce que vous avez à faire est d'allouer une nouvelle mémoire qui a maintenant vos nouvelles dimensions souhaitées, dans ce cas 4 et 2, puis copiez tout le contenu de votre matrice dans votre nouvelle matrice, puis libérez la mémoire de la matrice précédente ... c'est douloureux. Maintenant, nous allons voir comment la même chose est faite avec des vecteurs:

#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

modifier: quelques commentaires sur votre code d'origine:

  • En C++ ALL_CAP_NAMES se réfèrent généralement à des macros (quelque chose que vous # définir). Évitez de les utiliser dans d'autres contextes
  • Pourquoi déclarez-vous FIRSTDIM et SECONDDIM statiques? C'est absolument inutile. Si une variable locale est statique, cela signifie officieusement que ce sera la même variable la prochaine fois que vous appellerez la fonction avec la valeur maintenue. Puisque techniquement vous ne pouvez pas appeler un second sime, cela ne sert à rien. Même si vous pouviez le faire, ce serait toujours inutile.
  • vous devez écrire delete [] array[i]; et delete [] array; pour que le compilateur sache que int * et int ** que vous essayez de supprimer pointent vers un tableau, pas seulement un int ou int * respectivement.
+1

Juste un point pédant: ne pouvez-vous pas juste réaffecter 'myArray' à la taille 4 et assigner les pointeurs? Vous pouvez conserver les mêmes sous-tableaux et pointer vers eux depuis le 'myArray 'réalloué, non? – JoshD

+0

JoshD: Ne sabote pas mes tentatives pour effrayer les gens loin des réseaux :) Quand vous dites à vos enfants de ne pas prendre de drogue, vous ne mentionnez pas que si vous fumez du pot plusieurs fois, cela ne fera pas de vous un terroriste. c'est vrai :) –

+1

Vous pouvez faire mieux que cela: 'vector > matrix (3, vector (2));' Crée et initialise la matrice en une ligne. –

2

Disons que je veux ajouter un 4ème élément à la première dimension, à savoir myArray [3]. Est-ce possible?

Oui, mais c'est une douleur dans le cou. Cela revient essentiellement à allouer un nouveau tableau, comme le fait votre code existant (indice: mettez-le dans la fonction et faites les arguments de tailles à cette fonction) et copiez les éléments compatibles.

Modifier: L'une des choses que std::vector fait pour vous est de vous désallouer correctement la mémoire. Dans le code que vous avez, l'échec d'allouer l'un des tableaux le long de la 2ème dimension entraînera une fuite de mémoire. Une solution plus robuste initialiserait les pointeurs à 0 avant d'effectuer toute allocation. Un bloc d'exception peut alors attraper l'exception et libérer tout ce qui a été partiellement alloué. Comme ce code devient rapidement complexe, les gens ont recours à l'allocation d'un seul tampon et à l'adressage en utilisant une foulée ou en utilisant un réseau 1D d'interruptions 1D (c'est-à-dire std::vector de std::vector s).

Questions connexes