2010-10-08 10 views
0

Le code original i écrit utilise ces arguments:Comment modifier mon algorithme de fusion pour accepter différents arguments en C++?

int m = taille de liste triée 1

int n = taille de liste triée 2

int A [] = liste triée 1

int B [] = liste triée 2

int C [] = liste fusionnée de 1 et 2

on m'a demandé d'ajouter cette co de un fichier existant qui utilise ces différents arguments:

IntVectorIt de

IntVectorIt End1

IntVectorIt Start2

IntVectorIt FIN_2

IntVectorIt start3

Ces variables sont définies ici (n est la taille du premier tableau trié, m est la taille du deuxième tableau trié):

typedef vector<int> IntVector; 

typedef IntVector::iterator IntVectorIt; 

IntVector Vector1(n); 
IntVectorIt start1,end1,it1; 
start1 = Vector1.begin(); 
end1 = Vector1.end(); 

IntVector Vector2(m); 
IntVectorIt start2,end2,it2; 
start2 = Vector2.begin(); 
end2 = Vector2.end(); 

IntVector Vector3(n+m); 
IntVectorIt start3,end3,it3; 
start3 = Vector3.begin(); 
end3 = Vector3.end(); 

//--The variables for my version of merge 
IntVector MyVector(n+m); 
IntVectorIt mystart,myend,myit; 
mystart = MyVector.begin(); 
myend = MyVector.end(); 

Mon code de fusion:

void mymerge(int m, int n, int A[], int B[], int C[]) 
{ 
    int i, j, k = 0; 

    while (i < m && j < n) 
    { 
     if (A[i] <= B[j]) 
     { 
       C[k] = A[i]; 
       i++; 
     } 

     else 
     { 
       C[k] = B[j]; 
       j++; 
     } 

     k++; 
    } 

    if (i < m) 
    { 
     for (int p = i; p < m; p++) 
     { 
       C[k] = A[p]; 
       k++; 
     } 
    } 

    else 
    { 
     for (int p = j; p < n; p++) 
     { 
       C[k] = B[p]; 
       k++; 
     } 

    } 

} 

Si quelqu'un pouvait me aider à comprendre comment je pouvais prendre ces itérateurs comme arguments, il me aiderait à une tonne. Merci d'avance.

+0

Est-ce que ce travail est fait? – JoshD

+0

ouais pour une classe cs à NEU ... n'est-ce pas permis ici? – user177215

+0

@ user177215: les devoirs sont autorisés, mais ils doivent être marqués comme devoirs. Certaines personnes y sont sensibles, d'autres non, mais en général, vous obtiendrez plus d'indices et d'indices pour les questions de "devoirs", plutôt que de personnes qui affichent du code. Je me demande, en fait, combien de temps avant que quelqu'un soit accusé à tort par un logiciel anti-plagiat, parce que leur code ressemble beaucoup à leur propre première tentative *, qu'ils ont posté sur SO, et le logiciel pense avoir copié ... –

Répondre

2

Comme cela ressemble à des devoirs, je ne vais pas écrire toute la solution. Cependant, voici quelques suggestions sur la migration mymerge:

Modifier la signature à

void mymerge(
    IntVectorIt aStart, 
    IntVectorIt aEnd, 
    IntVectorIt bStart, 
    IntVectorIt bEnd, 
    IntVectorIt cStart, 
    IntVectorIt cEnd 
    ); 

Modifier les indices en cours d'exécution à itérateurs, par exemple

IntVectorIt i = aStart; 

changer la condition d'arrêt boucle à utiliser itérateurs, par exemple,

i != aEnd 
+1

Ou, si vous pensez que vous pouvez vous en sortir, appelez simplement votre fonction existante à partir de la version avec la bonne signature. 'vector' stocke son contenu de manière contiguë, tout comme un tableau. Vous pouvez donc passer 'aEnd - aStart' pour' m', '& * aStart' pour' A' (si m! = 0), et ainsi de suite.* Mais * cela ne marche que parce qu'on vous a demandé de le faire pour le vector, donc même si c'est facile en ce moment, vous ne serez probablement pas bien positionné pour la prochaine mission ... –

+0

merci à vous deux ... Je viens de terminer avec cette aide: D – user177215