關於交換兩個值的一些討論

2021-06-29 08:30:05 字數 1074 閱讀 9598

void swap_1(int& a, int& b)

以上是交換兩個int值的直覺方法

另外,其實還有

void swap_2(int& a, int& b)

以上情況不需要考慮int值相加溢位的問題,溢位了還可以減回來

另外還有一種方法

void swap_3(int& a, int& b)

swap_2和swap_3是不需要臨時變數的交換法,看起來很cool,實際上並沒有什麼效能上的優勢,用途大概是面試用?

另外,swap_3其實是有問題的,正確的寫法應該是

void swap_2(int& a, int& b)

}void swap_3(int& a, int& b)

}

原因在於,判斷a==b的情況避免swap(a,a)的時候會出現問題,面試的時候不要搞錯了

以上都是對於int型別的交換,那麼對於其他型別的交換呢

在float或double型別的交換中,swap_2方式的交換是錯誤的,原因在於float和double實質上是不精確的表示,會出現m + n - m != n的情況(注意運算順序)

毫無疑問,使用臨時變數的方法一般情況下都是正確的

templatevoid swap(t& lhs, t& rhs)

templatevoid swap(t* lhs, t* rhs)

不正確的情況在於,c++的類可以進行運算子過載, 為自己編寫拷貝建構函式

於是我們無法知道類的行為是否符合我們的預期

並且一次構造(臨時的類),兩次拷貝的代價是否符合我們的需要

此時我們需要乙個東西,那就是類的自定義函式,例如:stl的swap在對vector呼叫時,實際上會呼叫vector::swap(),以得到最佳的效能,至於swap模板如何判斷類是否含有自定義的swap成員函式,可以通過定義類的特化版swap來實現

交換兩個變數的值

交換兩個變數的值 交換兩個變數的值是我們學習c語言常見的問題,通常我們採取的方式是定義中間變數,通過中間變數交換這兩個變數值。1 直接在主函式裡完成 int a 2,b 3 int t t a a b b t 2 通過定義swap 完成交換,其中可以通過引用 位址傳遞完成變數值交換 引用 inclu...

交換兩個變數的值

有兩個整數a和b,下面將用四種方法把他們的值進行交換 方法1 借助臨時變數tmp include intmain 如果要求不能建立其他變數,還有下面的方法 方法2 巧妙進行數值運算 include intmain 方法3 二進位制異或運算 include intmain 整數10的二進位制數表示為 ...

交換兩個變數的值

交換兩個變數的值 方式一 定義臨時變數的方式 int temp num1 num1 num2 num2 temp 方式二 num1 num1 num2 num2 num1 num2 num1 num1 num2 好處 不用定義臨時變數 弊端 1 相加操作肯超過儲存範圍 2 有侷限性 只適用於數值型別...