預設版本
namespace
std}
如果類採用指標儲存資料,則預設交換方式會變得低效。因為只用交換兩個指標便能實現兩個物件的交換。因此需要特化版本的swap,由於指標是私有成員,因此需要乙個公有成員函式swap,完成實際的交換。然後由特化版本的swap呼叫該公有成員函式。我們不能修改namespace std的內容但我們可以為我們自定義型別完全特化標準模板。
全特化版本
class widgetimpl
;class widget
void swap(widget & other)
private:
widgetimpl * p;
};namespace
std}
如果處理的是類模板而不是類,則情況又不同了。因為函式模板(預設版本swap)只能全特化而不能偏特化。
因此不能寫成
namespace
std}
面對這種情況,慣常做法是為它新增乙個過載版本。我們可以全特化std內的template,但不能給std新增新的template。因此不能將非成員swap宣告為std::swap偏特化版本或者過載版本。採用的策略為將非成員swap和模板類放在同乙個命名空間。
非成員函式,非std::swap版本
namespace
widgetstuff
; templatet>
void swap(widget
& a,widget
& b)
}
如果不額外使用某個命名空間,那麼也可以,但會都處於global命名空間。這種做法對class和class template都行得通。但對於class還是應該特化乙個std::swap版本。因為編寫**時可能強制限定std::swap版本。
有這麼多版本的swap,那麼實際呼叫哪個版本呢?你希望的是呼叫t的專屬版本,並在該版本不存在時呼叫std內的一般版本。
template
void dosometing(t & a,t & b)
首先會在t所在命名空間或者global作用域內尋找任何t專屬swap,如果沒有找到,由於using std::swap;的存在,則會呼叫std內的版本,首先看有沒有特化版本,然後再是一般版本。
綜上,一共有default swap、member swap、non-member swap、std::swap全特化版本。
java中實現swap函式的幾種方式
public class testswap2 下面是主函式的實現 public static void main string args 2.採用類變數傳值 public class testswap 改變的是類變數的值 private static void swap testswap ts 3....
Swap函式的實現
一 資料沒有 真正的被交換 include include includeusing namespace std void sswap int,int int main int x 3 int y 5 sswap x,y int a x int b y cout x 二 資料 真正的被交換 使用指標...
swap函式自定義實現
swap函式大家都很熟悉了,用於將兩個物件進行交換,但是在std中swap需要進行乙個拷貝構造,兩次賦值操作。這對於小物件是可以接受的,但對於較大的物件來書,這個時間可是有點長了,所以可能要在特定的類中自定義swap成員函式。1 對於int型的swap函式,可以使用異或操作符來進行交換,具體看如下 ...