2010-11-27 2 views
7

В некоторых комп-SCI работ и испытаний, я вижу своп() реализована следующим образом:Почему swap() иногда реализуется путем передачи массива?

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

Почему не просто реализовать так:

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

Является ли идея бывший сделать очиститель вызывающего кода, не имея необходимости индексировать в массив для первых двух аргументов? Я понимаю, что это не очень важный вопрос, так как мы должны использовать std :: swap(), но мне все еще интересно.

ответ

6

Не все языки программирования поддерживают вызов по ссылке. Например, последний способ делать swap не относится к Java.

В книгах, содержащих псевдокод, обычно существует соглашение о том, что массивы и указатели не копируются при передаче, а все остальное копируется в вызове функции. Первый способ не требует специального объяснения того, как передаются аргументы.

Что касается вашей последней точки зрения о чистоте, это не так уж и много: в первом случае ваш призыв к обмену будет просто: swap(i, j, a);, тогда как в последнем случае вам нужно будет swap(a[i], a[j]);, введя некоторые скобки в выражении.

+1

Java? Это язык программирования? ;) – ybungalobill 2010-11-27 21:37:33

+0

В случае Java это не просто вызов по ссылке, но указатели infix, которые не поддерживаются. Большинство (всех?) Сборщиков мусора запрещают их, потому что они бесполезны для обработки GC. Эти языки, естественно, заставляют вас писать в стиле первого фрагмента в вопросе. – 2010-11-27 21:38:19

2

Ваш второй пример кода - C++, NOT C. C++ поддерживает ссылочные параметры, но C поддерживает ссылку только косвенно через указатели.

Я согласен, что вторая реализация чище. Чтобы заставить его работать на C, измените значение & по каждому из параметров на * и разыщите разницу между x и y (также с *) внутри функции.

Смежные вопросы