C++ 一个人如何交换价值?

C++ 一个人如何交换价值?,c++,C++,可能重复: 如何在不使用第三个变量的情况下交换两个变量的值 我想交换两个变量的值a和b使用: 你指的是一个很有名的谜语。答案取决于数据类型。泛型类型没有算法。除非您可以使用特定于处理器的指令在不使用第三个变量的情况下进行交换,否则您必须使用临时指令进行交换,抱歉 您可以使用std::swap,但这只会隐藏临时值。 有几种方法可以做到这一点。您可以交换指针,或者如果值是整数,您可以使用一些算术技巧: a=a+b; b=a-b; a=a-b; 你可以使用 然而,这不是一个好主意。同样来自维基百科

可能重复:

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

我想交换两个变量的值
a
b

使用:


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

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

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


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

a=a+b;
b=a-b;
a=a-b;
你可以使用

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


大多数现代编译器都可以优化naive swap中的临时变量,在这种情况下,naive swap使用的内存量和寄存器数与XOR swap相同,并且至少和XOR swap一样快,而且通常更快。[]XOR swap的可读性也低得多,而且对任何不熟悉该技术的人来说都可能是完全不透明的。通常情况下,你不会。没有理由不使用第三个变量,只要调用std::swap(a,b)继续你的生活

对于整数类型,您可以执行以下操作:

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

但这通常比只使用第三个变量的性能差

为什么不使用另一个变量?我认为这是不可能的。这是一个采访问题还是一个家庭作业?太多的重复了,比如说保罗@,值得注意的是C和C++是不一样的,而<>代码> STD::SWIFT/COM>(在C++中交换变量的“正确”方式)在C中不存在。全新用户在不进行搜索的情况下询问超级重复问题;这个问题是典型的家庭作业/面试问题。投票以极端偏见关闭、删除和终止。为什么人们还要回答呢?只有在第一次加法没有溢出的情况下,这才有效。我认为没有理由使用指针而不是引用。这使得调用代码更加笨拙。(如果我使用xorSwap(0,0)?)a)正如url所示,它是维基百科表单的直接副本。b)因为C不知道“引用”,因此这将在C++和C中工作。c)
if(x!=y)
涵盖了
xorSwap(0,0)
以及
xorSwap(&z,&z)
@akira:最后一点完全被忽略了,尽管如果一个参数为null,它仍然会爆炸。如果我们写C++,谁在乎它在C中工作吗?在我看来,引用要干净得多。@GMan:只是味道,在现实生活代码中只是一个次要的。真的不值得争论。@akira:嗯,我认为这不仅仅是味道。目前的代码并不健壮。我们应该在C++中编程C++,而不是C注释:这在引擎盖下使用了第三变量。但是你不必自己做,没有任何东西都是不可能的(异或交换不算,因为它只适用于整数(?也可能是其他原语?)。没有比这更好的了。@Vladimir:我建议也使用std::swap(),但这个答案并不是OP想要的。所以,请解释为什么使用std::swap()而不是hacky xorswap()更好。@delnan:“不可能”有点强。例如,x86有
xchg
操作码,可以轻松地交换两个整数(通常是指针)变量,而不需要临时变量。显然,库函数可以有一个专门的版本,它使用某些类型的内联汇编。使用STD:另一个原因是它经常是正确的类型。如果在C++中交换两个向量,vector:交换可以非常有效,因为它不需要将向量复制到第三向量。它可以简单地交换指向实际向量内容的内部指针。我怀疑std::swap可能会在可用的情况下使用这些快捷方式(如vector)?(@DeadMG:刚刚看到你的相关评论。)@Kirill:不同的不是值,而是变量本身。使用相同的位置进行交换使整个过程为0。如果位置相同,则相同的变量将相等。如果变量相等,则不应进行交换<代码>a!=b更重要common@Kirill:哈哈哈。我的坏朋友。:)为我提名“最愚蠢的时刻”。
a=a+b;
b=a-b;
a=a-b;
a = a^b;
b = b^a;
a = a^b;
void swap(int& a, int& b)
{
    if (a != b)
    {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}