簡體   English   中英

如何在c ++中更快地交換函數?

[英]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;
}

如果你能提供幫助,我將不勝感激......

String類有自己的swap函數。

items[a].swap(items[b]);

這是最快的方法,因為它訪問字符串內部並避免所有復制。

看到這里

你可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM