答案 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
变量a
和b
的一次特殊互换:
void swap_bools(bool &a, bool &b)
{
if (a != b)
{
a = !a, b = !b;
}
}