如何交换价值?

时间:2010-07-21 20:09:16

标签: c++

  

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

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

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

8 个答案:

答案 0 :(得分:17)

使用std::swap

std::swap(a,b)

答案 1 :(得分:9)

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

使用整数类型,您可以执行以下操作:

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

有几种方法可以做到。你可以交换指针,或者如果值是整数,你可以使用一点算术黑客:

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

答案 6 :(得分:0)

您可以使用XOR swap algorithm

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

然而,这不是一个好主意。也来自维基百科:

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

答案 7 :(得分:0)

通常,需要第三个空变量来交换其他两个变量的内容。

但是,有特殊情况。以下是两个bool变量ab的一次特殊互换:

void swap_bools(bool &a, bool &b)
{
    if (a != b)
    {
        a = !a, b = !b;
    }
}