2016-08-21 53 views
1
int main() { 
    std::string str; 
    str.reserve(9999); 

    { 
     std::string s1("aaa"); 
     std::string s2("bbb"); 
     // can both strings s1, s2 be moved to str? 
     // for example str should be "aaabbb" 
    } 

} 

我的問題:是否有可能竊取的s1s2記憶形成的s1s2一個連接字符串(因爲它已經有足夠的空間用於兩者)?移動字符串到另一個字符串中有足夠的能力

+0

加運算符對於多個級聯s1 + s2 + s3是昂貴的...... – mkmostafa

+0

對於C++ 11中的多級聯而言,加運算符並不昂貴。 –

+0

@HowardHinnant你能詳細解釋一下嗎?我所理解的是最後兩個字符串將被添加到一個新字符串中,該字符串將在返回新字符串之前被添加到字符串中,等等。在這個問題之後,我看不到在中間使用任何移動操作的可能性。由於在添加到返回的字符串期間無法移動任何這些臨時文件。我考慮實現遍歷整個事物的表達式模板,並根據總大小構建一個字符串,然後一次預留容量和複製所有內容。 – mkmostafa

回答

1

因爲用於std::string的內存必須是連續的,所以無法竊取兩個獨立字符串的內存。

從C++ 14,部分21.4.1/4:

在basic_string的對象的炭狀物體將被連續地存儲。也就是說,對於任何basic_string 對象s,身份&*(s.begin() + n) == &*s.begin() + n應該保持n的所有值,使得0 < = n < s.size()。

+1

@mkmostafa:'std :: list'有一個拼接操作,但它可能不是一個好選擇,因爲每個字符使用的內存量很大。 –

+0

基本上是因爲std :: string是一個指向char的指針,它不能指向兩個不同的字符指針(字符串在不同的內存位置)? – mkmostafa

+0

@mkmostafa:這並不完全準確,但它並不是一個不錯的看待它的方式。 –

相關問題