Почему swap () иногда реализуется путем передачи массива? - PullRequest
7 голосов
/ 28 ноября 2010

В некоторых компьютерных работах и ​​тестах я вижу, что 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 (), но мне все еще интересно.

Ответы [ 2 ]

6 голосов
/ 28 ноября 2010

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

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

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

2 голосов
/ 28 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...