第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

小朋友學(xué)經(jīng)典算法(13):兩數(shù)交換

標(biāo)簽:
Go

这里咱们要考虑的是,两个数相等的交换情况。

#include <iostream>#include <algorithm>using namespace std;// 两个参数是指针(指向地址的引用)void myswap(int *x, int *y){
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
}// 两个参数是引用,在这里&代表引用,不代表地址void myswap2(int &x, int &y){
    x ^= y;
    y ^= x;
    x ^= y;
}int main(){    cout << "**********交换不同的值**********" << endl;    int a = 1, b = 2;
    myswap(&a, &b); // 因为myswap的参数是指针,所以必须传地址
    cout << a << ' ' << b << endl;    int a2 = 3, b2 = 4;
    myswap2(a2, b2);    cout << a2 << ' ' << b2 << endl;    cout << "**********交换相同的值**********" << endl;    int a3 = 5, b3 = 5;
    myswap(&a3, &b3); // 因为myswap的参数是指针,所以必须传地址
    cout << a3 << ' ' << b3 << endl;    int a4 = 6, b4 = 6;
    myswap2(a4, b4);    cout << a4 << ' ' << b4 << endl;    int c[1];
    c[0] = 7;
    myswap(&c[0], &c[0]);    cout << c[0] << ' ' << c[0] << endl;    int d[1];
    d[0] = 8;
    myswap2(d[0], d[0]);    cout <<d[0] << ' ' << d[0] << endl;    int e[1];
    e[0] = 9;
    swap(e[0], e[0]);    cout <<e[0] << ' ' << e[0] << endl;    return 0;
}

运行结果:

**********交换不同的值**********
2 1
4 3
**********交换相同的值**********
5 5
6 6
0 0
0 0
9 9

结果显示,前两组数值不同的两个数,能交换成功。后五组相同的值,交换成功的有3组。不成功的有两组,并且值都变成了0。
这是什么原因呢?
观察最后三对的数,都是数组里的同一元素交换。myswap和myswap2函数是咱们自己定义的,swap函数是由<algorithm>提供的。可见自己写的两个函数,一定存在bug。

仔细观察,发现a3 = 5, b3 = 5,这是两个不同的变量(在内存里的地址不同),而myswap2(d[0], d[0]),这是对同一个地址里的数交换。
d0 = 8时,
a = a ^ b = 8 ^ 8 = 0,因为a和b都指向d0,所以此时b = a = 0。
b = b ^ a = 0 ^ 0 = 0,
a = a ^ b = 0 ^ 0 = 0,
所以最终得到的是0 0,而不是8 8。
对于myswap(&c[0], &c[0]),与myswap2(d[0], d[0])的道理是一样的。

改进:如果值一样,那就不用交换了:

#include <iostream>#include <algorithm>using namespace std;// 两个参数是指针(指向地址的引用)void myswap(int *x, int *y){    if(x != y)
    {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
    }
}// 两个参数是引用,在这里&代表引用,不代表地址void myswap2(int &x, int &y){    if(x != y)
    {
        x ^= y;
        y ^= x;
        x ^= y;
    }
}int main(){    cout << "**********交换不同的值**********" << endl;    int a = 1, b = 2;
    myswap(&a, &b); // 因为myswap的参数是指针,所以必须传地址
    cout << a << ' ' << b << endl;    int a2 = 3, b2 = 4;
    myswap2(a2, b2);    cout << a2 << ' ' << b2 << endl;    cout << "**********交换相同的值**********" << endl;    int a3 = 5, b3 = 5;
    myswap(&a3, &b3); // 因为myswap的参数是指针,所以必须传地址
    cout << a3 << ' ' << b3 << endl;    int a4 = 6, b4 = 6;
    myswap2(a4, b4);    cout << a4 << ' ' << b4 << endl;    int c[1];
    c[0] = 7;
    myswap(&c[0], &c[0]);    cout << c[0] << ' ' << c[0] << endl;    int d[1];
    d[0] = 8;
    myswap2(d[0], d[0]);    cout <<d[0] << ' ' << d[0] << endl;    int e[1];
    e[0] = 9;
    swap(e[0], e[0]);    cout <<e[0] << ' ' << e[0] << endl;    return 0;
}

运行结果:

**********交换不同的值**********
2 1
4 3
**********交换相同的值**********
5 5
6 6
7 7
8 8
9 9

现在结果对了。在此,咱们可以进一步推断<algorithm>中的swap函数的实现方式:
(1)参数是用引用而不是用指针,因为调用方式 是swap(e[0], e[0])而不是swap(&e[0], &e[0])
(2)swap内部用if作了判断。



作者:海天一树X
链接:https://www.jianshu.com/p/7c6ef94d5059


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消