Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更好的c+的ow级别int交换+; 我学习C++,我有一个函数,比如……/p> void int_swap(int *n, int *m){ int temp; temp = *n; *n = *m; *m = temp; }_C++_Pointers_Swap - Fatal编程技术网

更好的c+的ow级别int交换+; 我学习C++,我有一个函数,比如……/p> void int_swap(int *n, int *m){ int temp; temp = *n; *n = *m; *m = temp; }

更好的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; } } 尽管大多数现代编译器都会自动优化代码,因此编译器可能已经选择了最有效的方法

我只想让它交换2整数。这纯粹是一个学习练习


它很好用。我只是想知道有没有更好的方法来处理更大类型的对象。在不创建临时文件的情况下可以完成吗

异或交换不需要中间变量:

从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可能会导致溢出。