into - string to char array c++




字符串+=s1和字符串=字符串+ s1之間的差異 (3)

當我使用 fans = fans + s[i] 時,我的一個程序超出了時間限制,而當我使用 fans += s[i] 它被接受時...為什麼會發生這種情況? 要解釋一下,粉絲是一個字符串,s也是一個字符串,所以迭代字符串si只需要s的一些字符,所以我創建一個新的字符串fans.Now有兩種方法可以在我的新字符串中添加字符球迷。 問題在下面提到

fans = fans + s[i]; // gives Time limit exceeded 
fans += s[i];       // runs successfully

如果使用 fans=fans+s[i] ,則會在每次循環傳遞中復制該字符串。 新元素將添加到字符串的副本中,結果將重新分配給變量 fans 。 在此之後,必須刪除舊字符串,因為它不再被引用。 這需要花費很多時間。

如果使用增強賦值 fans+=s[i] ,則不會在每個循環傳遞中復製字符串,也不需要刪除引用變量,因為此處沒有引用變量。 這節省了大量時間。

我希望你現在能理解!!


對於 內置類型, a += ba = a + b 完全相同,但對於類,這些運算符會被重載並調用不同的函數。
在您的示例中, fans = fans + s[i] 創建一個臨時字符串,並將其分配(移動)給 fans ,但 fans += s[i] 不會創建那個臨時字符串,因此它可能更快。


std::string 有成員 operator +operator += 。 前者通常通過中間臨時實現後者。 有效地查找類似的內容(如果您想確切了解您的實施內容,請查看您的實施源):

/// note reference return type
std::string& operator +=(char c) 
{
    this->append(c);
    return *this;
}

// note value return type
std::string operator +(char c) const
{
    std::string tmp = *this;
    tmp += c; // or just tmp.append(c) directly
    return tmp;
}

tmp 的設置很昂貴。 移動分配 語義可以(並且通常是)使得調用者端的最終目的地更好,但是臨時的費用仍然存在。 做幾次,你不會注意到差異。 做成千上萬,或數百萬等等,它可能意味著一個不同的 世界







compound-assignment