![](/img/trans.png)
[英]C++ how can I make a swap function between two variables which are different in type
[英]How can I make swap function faster in c++ ?
我正在用c ++編寫一個字符串排序算法,我想知道我是否可以更快地進行這種交換操作。
void swap(string *items,int a, int b ){
string temp;
temp = items[a];
items[a] = items[b];
items[b] = temp;
}
如果你能提供幫助,我將不勝感激......
你可以使用std::swap()
:
void swap(string *items, int a, int b) {
std::swap(items[a], items[b]);
}
但是不能保證這會快得多,而且這可能不是你代碼的緩慢部分。 您是否測量過交換操作與其余代碼相比的性能?
使用std::swap
; 它會盡力而為。 如果您的編譯器支持C ++ 11的右值引用,這意味着它將利用移動語義來避免交換函數中出現的副本。
但是,如果您的編譯器不支持右值引用,它很可能會執行與交換函數相同的方式。
大多數標准庫實現將實現std::swap
類似於:
template<typename T>
void swap(T& a, T& b) {
T temp(std::move(a));
a = std::move(b);
b = std::move(temp);
}
std::move
函數將向傳入的變量返回一個右值引用(T &&)。當您嘗試分配此右值引用時,它將調用該類型的move運算符(如果有)。 如果移動操作符不可用,它將照常調用復制操作符。
在std::string
的情況下,上面的交換函數不會使用C ++ 11進行字符串復制; 只復制內部數據,如字符串長度和C字符串指針。 如果沒有C ++ 11,它將執行實際字符串內容的三個副本。
您可以更改算法以處理string*
類型的元素而不是string
。 然后, swap
函數中的所有賦值都將對指針進行操作,並且速度更快,因為不會涉及字符串復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.