2009-04-16 7 views
7

J'apprends à programmer, et C++ est ma première langue. Ne vous embêtez pas à utiliser des pointeurs pour me montrer - je ne les comprends pas encore, et ne me dérangerai pas avant d'avoir plus de temps libre à consacrer à cela.Pouvez-vous redimensionner un tableau C++ après l'initialisation?

int mergeSort() 
{ 
    const int n = 9; 
    int originalarray[n] = {1, 3, 5, 7, 9, 2, 4, 6, 8}; 


    const int halfelements = (sizeof(originalarray)/sizeof(int))/2; 
    int farray[halfelements]; 
    int sarray[halfelements]; 

    for (int i = 0; i < halfelements; i++) { 
     farray[i] = originalarray[i]; 
    } 

    for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
     sarray[x] = originalarray[i]; 
    } 

J'ai été affecté (je ne suis pas à prendre des cours - en train d'apprendre avec quelques amis me aider) un algorithme de tri de fusion, avec l'algorithme expliqué, mais pas la mise en œuvre. Je veux réécrire cela afin qu'il fonctionne à la fois pour les entiers pairs et impairs. J'ai essayé d'ajouter ce code:

if ((n % 2) != 0) int farray[halfelements + 1]; 

Afin que je puisse utiliser le même nombre entier pour itérer sur les deux tableaux suivants. Un sizeof (farray) montre être 16 octets, ou 4 entiers. Donc, ce n'est pas le redimensionnement. Ce que je veux savoir - est-il possible de redimensionner les tableaux après leur initialisation?

Éditer: Comment implémenter un vecteur? Je ne comprends pas comment utiliser les itérateurs dans une boucle pour parcourir et copier les valeurs.

Répondre

16

Les tableaux C++ sont de taille fixe.

Si vous avez besoin d'un "tableau redimensionnable", vous devez utiliser std::vector au lieu d'un tableau.

+0

OK, merci. J'ai compris comment implémenter std :: vector dans cet algorithme.Bien que j'aurais aimé ne pas avoir passé deux heures à déboguer mon code, juste pour comprendre l'en-tête de ma fonction "int mergeSort (std :: vector, int)" il manquait un "" =/ – jkeys

+0

par des tableaux dynamiques de toute façon? La redimensionnement dynamique d'un tableau ou d'un vecteur doit entraîner les mêmes pénalités de performance.> – Jason

1

Si vous souhaitez redimensionner un tableau, vous voulez probablement utiliser un vecteur, qui peut être redimensionné automatiquement.

4

Mon conseil est encore plus fort: utilisez std::vector<> (et autres) sauf si vous avez une très bonne raison d'utiliser une matrice de style C. Puisque vous apprenez le C++, je doute que vous ayez une telle raison: utilisez std::vector<>.

+0

Étant donné qu'un vecteur est autorisé à utiliser le stockage contigu, vous pouvez utiliser un vecteur même en passant à un pointeur de méthode. Ce n'est que lorsque vous passez une référence/pointeur vers un pointeur pour une méthode de dimensionnement des données que vous utilisez la mémoire brute. – Richard

1

Vous pouvez utiliser l'opérateur [] avec un vecteur comme vous le feriez dans un tableau. Vous pouvez mettre en œuvre cela avec un quelque chose de vecteur comme celui-ci (si vous vouliez utiliser des méthodes de vecteur):

#include <vector> 

const int halfelements = originalarray.size()/2; //use size to get size 
vector <int> farray(halfelements); 
vector <int> farray(halfelements); 

for (int i = 0; i < halfelements; i++) { 
    farray.push_back(originalarray[i]); //adds element at i to the end of vector 
} 

for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
    sarray.push_back(originalarray[i]); 
} 

Vous pouvez également utiliser .at (index) pour ajouter la vérification des limites à l'accès vectoriel.

+0

s'il vous plaît ne pas utiliser la balise HTML "pré" pour le code - à la place, sélectionnez le code avec votre souris et tapez ctrl-K ou cliquez sur l'icône de code –

+0

Il devrait utiliser les constructeurs vectoriels (iter, iter). vecteur farray (originalarray.begin(), & originalarray [moitié]), sarray (& originalarray [moitié], originalarray.end()); Il élimine la copie par la suite. Mais c'est probablement confus. – jmucchiello

0

Si vous voulez savoir pourquoi votre première idée compilée mais ne semble pas fonctionner:

Lorsque vous omettez les accolades dans une instruction if:

if ((n % 2) != 0) int farray[halfelements + 1]; 

c'est la même chose que si vous « d entre eux ont utilisé:

if ((n % 2) != 0) { 
    int farray[halfelements + 1]; 
} 

il fait un « farray » de la bonne taille - et il va immédiatement hors de portée et a disparu, et vous vous retrouvez avec seulement l'original.

2

Je recommanderais également std::vector. Toutefois, si vous êtes coincé avec un tableau, vous pouvez toujours malloc la mémoire, puis realloc si vous devez agrandir la baie.

Faire une recherche ici sur SO, il y a des renseignements sur malloc et realloc.

+0

Moi aussi j'utilise cette convention. – Hydro

Questions connexes