更好的c+的ow级别int交换+; 我学习C++,我有一个函数,比如……/p> void int_swap(int *n, int *m){ int temp; temp = *n; *n = *m; *m = temp; }
我只想让它交换2整数。这纯粹是一个学习练习更好的c+的ow级别int交换+; 我学习C++,我有一个函数,比如……/p> void int_swap(int *n, int *m){ int temp; temp = *n; *n = *m; *m = temp; },c++,pointers,swap,C++,Pointers,Swap,我只想让它交换2整数。这纯粹是一个学习练习 它很好用。我只是想知道有没有更好的方法来处理更大类型的对象。在不创建临时文件的情况下可以完成吗 异或交换不需要中间变量: 从Wiki页面: void xorSwap (int *x, int *y) { if (x != y) { *x ^= *y; *y ^= *x; *x ^= *y; } } 尽管大多数现代编译器都会自动优化代码,因此编译器可能已经选择了最有效的方法
它很好用。我只是想知道有没有更好的方法来处理更大类型的对象。在不创建临时文件的情况下可以完成吗 异或交换不需要中间变量: 从Wiki页面:
void xorSwap (int *x, int *y) {
if (x != y) {
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
}
尽管大多数现代编译器都会自动优化代码,因此编译器可能已经选择了最有效的方法来交换这两个变量。请参阅wiki文章中的“实践中避免使用的原因”部分
void swap(int &a,int &b)
{
a=a+b;
b=a-b;
a=a-b;
}
您可以使用引用模板
template<typename T>
void swap(T& x, T& y)
{
T temp = std::move(x);
x = std::move(y);
y = std::move(temp);
}
void swap(int & x , int& y)
{
if(x != y)
y ^= x ^= y ^= x;
}
void swap (int& x, int& y)
{
x += y;
y = x - y;
x -= y;
}
无效掉期(T&x、T&y)
{
温度=标准::移动(x);
x=标准::移动(y);
y=标准::移动(温度);
}
无效交换(整数和x、整数和y)
{
如果(x!=y)
y^=x^=y^=x;
}
无效交换(整数和x、整数和y)
{
x+=y;
y=x-y;
x-=y;
}
POD类型还是复杂类型?更好的方法是对一般类型(这是std::swap
所做的)和它的特殊版本(如果需要)使用临时和移动语义。交换两个int可以在不使用临时xor的情况下完成,在您的示例中,可以使用*n=*n^*m*m=*n^*m*n=*n^*m@ChrisTaylor,即使如此,int_交换(指针指向5,指针指向另5)代码>@Beta原语,但我想我会对对象感兴趣,所以为什么不使用中间值呢?在这种情况下,XOR交换为何/如何受益?临时变量是“相同数量的代码”,在更多情况下,只有一个非常有效。OP询问“是否可以在不创建临时变量的情况下完成?”此解决方案有可能在a=a+B时溢出xor版本可能在序列点之间多次更新变量时出现问题。add和sub可能会导致溢出。