【问题标题】:Why is swap() sometimes implemented by passing an array?为什么 swap() 有时通过传递数组来实现?
【发布时间】:2011-05-16 16:38:45
【问题描述】:

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

【问题讨论】:

    标签: c++ c algorithm computer-science


    【解决方案1】:

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

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

    关于你关于清洁的最后一点,它并没有太大的不同:在前一种情况下,你的交换电话很简单:swap(i, j, a);,而在后一种情况下,你必须swap(a[i], a[j]);,在表达式。

    【讨论】:

    • Java?它是一种编程语言吗? ;)
    • 在 Java 的情况下,不仅不支持引用调用,而且不支持中缀指针。大多数(全部?)垃圾收集语言都禁止它们,因为它们对于 GC 来说是一团糟。这些语言自然会驱使您以问题中第一个 sn-p 的风格写作。
    • @Pascal:C# 支持ref 参数。
    • 这是否包括对块内位置的引用(例如,对数组元素的引用)?如果是这样,它肯定是通过传递一个指向 bloc 的指针和一个字节码级别的偏移量来实现的。
    • @Pascal:CIL 有一个名为 ldelema 的指令,它从堆栈中获取一个数组和一个索引,并将托管引用(由指令集本机支持)推送到特定数组元素以堆栈,它被传递给函数。在构思好引用之后,它是数组元素、字段还是局部变量都没有关系。您可以以统一的方式将局部变量与对象字段或数组元素交换。
    【解决方案2】:

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

    我同意第二种实现方式更简洁。为了使其在 C 中工作,请将每个参数中的 & 更改为 * 并在函数内取消引用每个 xy(也使用 *)。

    【讨论】:

    • 谢谢,是的,我知道 & 是一个 C++ 特性。我在问题的标签中包含了 C,因为我认为它会吸引纯 C 的人(如果他们甚至存在的话)。
    • @Fast Fish:请不要包含旨在增加受众的标签。
    • @dmckee,不确定我是否关注你。在我看来,考虑到我最初在问题中提到的论文是针对 C 或使用 C 的,C 程序员将能够提供对这种做法的见解。增加受众对于接触正确的受众是明智的。如果这就是你所说的,那么没有试图增加听众本身。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多