2010-11-27 24 views
7

Dans certains papiers comp-sci et des tests, je vois swap() mis en œuvre comme ceci:Pourquoi swap() est parfois implémenté en passant un tableau?

void swap(int x, int y, int *a) 
{ 
    int t = a[x]; 
    a[x] = a[y]; 
    a[y] = t; 
} 

Pourquoi mettre en œuvre tout simplement pas comme ceci:

void swap(int& x, int& y) 
{ 
    int t = x; 
    x = y; 
    y = t; 
} 

Est-ce l'idée de la première à faire le nettoyeur de code appelant, en n'ayant pas à indexer dans le tableau pour les deux premiers arguments? Je me rends compte que ce n'est pas une question très importante, puisque nous devrions utiliser std :: swap(), mais je suis toujours curieux.

Répondre

6

Tous les langages de programmation ne prennent pas en charge l'appel par référence. Par exemple, la dernière façon de faire swap ne s'applique pas à Java.

Dans les livres contenant du pseudo-code, il existe généralement une convention selon laquelle les tableaux et les pointeurs ne sont pas copiés lorsqu'ils sont transmis et tout le reste est copié dans un appel de fonction. L'ancienne méthode ne nécessite aucune explication particulière sur la façon dont les arguments sont passés. En ce qui concerne votre dernier point sur la propreté, ce n'est pas tellement différent: dans le premier cas, votre appel à swap serait simplement: swap(i, j, a); alors que dans ce dernier, vous devrez swap(a[i], a[j]);, en introduisant des crochets dans l'expression.

+1

Java? Est-ce un langage de programmation? ;) – ybungalobill

+0

Dans le cas de Java, ce ne sont pas seulement les pointeurs d'appel par référence mais les pointeurs infixes qui ne sont pas pris en charge. La plupart (toutes?) Les langues collectées par les ordures les interdisent parce qu'elles sont un fouillis à manipuler pour le GC. Ces langues vous poussent naturellement à écrire dans le style du premier extrait de la question. –

+1

@Pascal: C# supporte les paramètres 'ref'. –

2

Votre deuxième exemple de code est C++, NOT C. C++ prend en charge les paramètres de référence, mais C ne prend en charge que la référence indirectement via des pointeurs. Je suis d'accord que la deuxième mise en œuvre est plus propre. Pour le faire fonctionner en C, changez le & dans chacun des paramètres en * et déréférenciez chaque x et y (également avec *) dans la fonction.

+0

Merci, oui je suis conscient que & est une fonctionnalité C++. J'ai inclus C dans les étiquettes pour la question parce que je pensais que cela ferait appel aux gens purs C (s'ils existent même). –

+0

@Fast Fish: S'il vous plaît ne pas inclure des balises avec l'intention d'augmenter votre auditoire. – dmckee

+0

@dmckee, je ne suis pas sûr de vous suivre. À mon avis, les programmeurs C seraient capables de donner un aperçu de cette pratique, étant donné que les articles auxquels j'ai fait référence dans ma question visaient C ou l'utilisation de C. Augmenter l'auditoire est judicieux pour atteindre le bon auditoire. Il n'y avait aucune tentative d'augmenter le public pour son propre intérêt, si c'est ce que vous parliez. –