为什么swap()有时通过传递数组来实现?

时间:2010-11-27 21:32:21

标签: c++ c algorithm computer-science

在一些comp-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(),但我仍然很好奇。

2 个答案:

答案 0 :(得分:6)

并非所有编程语言都支持通过引用进行调用。例如,后一种做swap的方式不适用于Java。

在包含伪代码的书籍中,通常会有一种约定,即传递时不会复制数组和指针,而是在函数调用中复制其他所有内容。前一种方式不需要关于参数传递方式的特殊解释。

关于你关于清洁的最后一点,它并没有太大的不同:在前一种情况下,你对交换的调用只是:swap(i, j, a);而在后一种情况下,你必须swap(a[i], a[j]);,在表达式中引入一些括号。

答案 1 :(得分:2)

你的第二个代码示例是C ++,而不是C. C ++支持引用参数,但C只支持通过指针间接引用。

我同意第二个实施更清洁。为了使其在C中有效,请将每个参数中的&更改为*并取消引用每个xy(同时使用*)在函数内部。