-1

我试图涵盖所有swap功能实现。

swap函数的以下实现中,不需要临时变量来交换两个参数的值:

void swapNoTemp1(int &a, int &b){
    a = a + b;
    b = a - b;
    a = a - b; 
}

或者

template <class T>
void swapNoTemp2(T& i, T& j){
    i -= j;
    j += i;  
    i = (j - i);  
}

或者

void swapNoTemp3(int &a, int &b){
    a ^= b;
    b ^= a;
    a ^= b;
}

因此,就使用的内存而言,它比以下内容更有效:

void swap(int &a, int &b){
    int temp = a;
    a = b;
    b = temp; 
}

另一方面,swap可以使用以下方式实现:

void swapPointers(int *i, int *j) {
    int t = *i;
    *i = *j;
    *j = t;
}

我正在尝试比较所有现有的实现并了解它们的适用范围。

4

1 回答 1

3

第一个函数的行为未定义。算术可能会导致溢出,并且在某些机器上,溢出会导致异常。

该标准规定:

如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。[注意:大多数现有的 C++ 实现忽略整数溢出。... ]

尽管在实践中您很有可能该功能会起作用,但最好避免使用它。

于 2015-03-28T01:52:57.617 回答