【问题标题】:How does one swap values? [duplicate]如何交换价值? [复制]
【发布时间】:2010-07-21 20:09:15
【问题描述】:

可能重复:
What is the fastest way to swap values in C?

如何在不使用第三个变量的情况下交换两个变量的值?

我想交换(交换)两个变量 ab 的值。

【问题讨论】:

  • 你为什么不想使用另一个变量?我认为这是不可能的。
  • 这是面试题还是家庭作业?
  • Way 已经在 SO 上有太多重复项,例如stackoverflow.com/questions/36906/…
  • @Paul R,值得注意的是,C 与 C++ 不同,std::swap(在 C++ 中交换变量的“正确”方法)在 C 中不存在。跨度>
  • 全新用户在没有先搜索的情况下提出了超级重复的问题;问题是经典的作业/面试问题。以极端偏见投票关闭、删除和终止。为什么还有人回答?

标签: c++


【解决方案1】:

使用std::swap:

std::swap(a,b)

【讨论】:

  • 注意:这确实使用了引擎盖下的第三个变量。但是您不必自己做,而且无论如何都不可能(XOR 交换不计算在内,因为它仅适用于整数(?也许其他原语也是如此?))。没有比这更好的了。
  • @Vladimir:我建议也使用 std::swap() ,但这个答案并不是 OP 真正要求的。所以,解释一下为什么最好使用 std::swap() 而不是 hacky xorswap。
  • @delnan:“不可能”有点强。例如,x86 有xchg 操作码,可以轻松交换两个整数(通常是指针)变量,而不涉及临时变量。显然,一个库函数可以有一个专门的版本,它对某些类型使用内联汇编。
  • 使用 std::swap 的另一个原因是它经常专门用于正确的类型。
  • 如果在 C++ 中交换两个向量,vector::swap 可以非常有效,因为它不需要将任一向量复制到第三个向量。它可以简单地交换指向实际向量内容的内部指针。我怀疑 std::swap 可能会在可用的情况下使用这些快捷方法(如矢量)? (@DeadMG:刚刚看到你的相关评论。)cplusplus.com/reference/stl/vector/swap
【解决方案2】:

通常情况下,您不会。没有理由不使用第三个变量,只需致电 std::swap(a, b) 并继续您的生活。

使用整数类型,您可以:

void swap(int& a, int& b)
{
    if (a != b)
    {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}

但这通常比仅使用第三个变量提供更差的性能。

【讨论】:

  • @Kirill:不是值必须不同,而是变量本身。与相同的位置交换使整个事情 0。
  • 如果位置相同的变量将相等。如果变量相等,您也不应该进行交换。 a != b 比较常见
  • @Kirill:哈哈,呵呵。我的错。 :) 为我提名“最愚蠢的时刻”。
【解决方案3】:

你指的是一个非常有名的谜语。答案取决于数据类型。泛型类型没有算法。

【讨论】:

    【解决方案4】:

    https://en.wikipedia.org/wiki/XOR_swap_algorithm

    void xorSwap (int *x, int *y) {
        if (x != y) {
            *x ^= *y;
            *y ^= *x;
            *x ^= *y;
        }
    }
    

    【讨论】:

    • 我认为没有理由使用指针而不是引用。只是使调用代码更笨拙。 (如果我这样做xorSwap(0, 0)呢?)
    • a) 正如 url 所暗示的,它是维基百科表格的直接副本。 b) 因为 c 不知道“引用”,因此这将在 c++ 和 c 中工作。 c) if (x != y) 涵盖 xorSwap(0, 0) 以及 xorSwap(&z, &z)
    • @akira:在最后一点上完全空白,但如果一个参数为空,它仍然会爆炸。如果我们正在编写 C++,谁在乎它是否在 C 中工作?参考文献更清晰 IMO。
    • @GMan:只是品尝一下,在现实生活中的代码中只是一个次要的。真的不值得争论。
    • @akira:嗯,我认为这不仅仅是品味。您的代码本身并不健壮。我们应该用 C++ 编写 C++,而不是 C。
    【解决方案5】:

    除非您可以使用特定于处理器的指令在没有第三个变量的情况下进行交换,否则您将不得不使用临时来进行交换,抱歉。

    您可以使用std::swap,但这只会隐藏临时的。

    【讨论】:

      【解决方案6】:

      有几种方法可以做到这一点。您可以交换指针,或者如果值是整数,您可以使用一些算术技巧:

      a=a+b;
      b=a-b;
      a=a-b;
      

      【讨论】:

      • 这只有在第一次添加没有溢出时才有效。
      【解决方案7】:

      您可以使用XOR swap algorithm

      a = a^b;
      b = b^a;
      a = a^b;
      

      但是,这不是一个好主意。同样来自维基百科:

      大多数现代编译器可以优化掉原始交换中的临时变量,在这种情况下,原始交换使用与 XOR 交换相同数量的内存和相同数量的寄存器,并且至少与 XOR 交换一样快,而且通常更快。 [cite] XOR 交换的可读性也低得多,对于不熟悉该技术的任何人来说都是完全不透明的。

      【讨论】:

        猜你喜欢
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        相关资源
        最近更新 更多