2010-11-27 23 views
7

En algunos papeles comp-sci y pruebas, veo intercambio() implementado de esta manera:¿Por qué swap() a veces se implementa pasando una matriz?

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

Por qué no simplemente lo apliquen, así:

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

es la idea a la antigua para hacer el limpiador de código de llamada, al no tener que indexar en la matriz para los dos primeros argumentos? Me doy cuenta de que no es una pregunta muy importante, ya que deberíamos usar std :: swap(), pero aún tengo curiosidad.

Respuesta

6

No todos los lenguajes de programación admiten llamadas por referencia. Por ejemplo, la última forma de hacer swap no se aplica a Java.

En los libros que contienen pseudocódigo, por lo general existe la convención de que las matrices y punteros no se copian cuando se pasan y todo lo demás se copia en una llamada de función. La primera forma no requiere una explicación especial sobre la forma en que se pasan los argumentos.

Respecto a su punto final acerca de la limpieza, no es tan diferente: en el primer caso, su llamada al intercambio sería simplemente: swap(i, j, a);, mientras que en este último, tendrá que swap(a[i], a[j]);, introduciendo algunos corchetes en la expresión.

+1

Java? ¿Es un lenguaje de programación? ;) – ybungalobill

+0

En el caso de Java, no se trata solo de llamadas por referencia, sino de punteros infijos que no son compatibles. La mayoría (¿todos?) Los lenguajes recolectados con basura los prohíben porque son un desastre para manejar para el GC. Estos idiomas, naturalmente, lo llevan a escribir en el estilo del primer fragmento de la pregunta. –

+1

@Pascal: C# admite los parámetros 'ref'. –

2

Su segundo ejemplo de código es C++, NO C. C++ admite parámetros de referencia, pero C solo admite la referencia indirectamente a través de punteros.

Estoy de acuerdo en que la segunda implementación es más clara. Para que funcione en C, cambie el & en cada uno de los parámetros a * y desreferencia cada x y y (también con *) dentro de la función.

+0

Gracias, sí, soy consciente de que & es una función de C++. Incluí C en las etiquetas de la pregunta porque pensé que atraería a gente pura de C (si es que existe). –

+0

@Fast Fish: no incluya etiquetas con la intención de aumentar su audiencia. – dmckee

+0

@dmckee, no estoy seguro de que te sigo. En mi opinión, los programadores C podrían ofrecer una idea de esta práctica, dado que los documentos a los que me refería originalmente en mi pregunta estaban dirigidos a C o a usar C. Aumentar la audiencia es sensato con el fin de llegar a la audiencia correcta. No hubo ningún intento de aumentar la audiencia por sí misma, si eso es lo que estaba hablando. –

Cuestiones relacionadas