2012-04-25 89 views
6

當我們必須使用字符串操作時,std :: string和std :: stringbuf之間是否存在任何顯着性能差異,如果是,爲什麼。performance stringbuf vs string

更一般的情況是,如果std :: stringbuf優於std :: string,

+2

我實際上會問另一種方式:爲什麼當'string'有更多的方法可用時,heck使用'stringbuf',受虐狂?我想你來自Java或C#與他們的StringBuilder類變通... – 2012-04-25 10:58:58

+0

@MatthieuM。:不,我是C++程序員,但是爲什麼ostringstream在內部使用stringbuf而不是字符串 – Guillaume07 2012-04-25 11:50:15

+0

這完全不同。從'ostream'派生的所有類都使用從[streambuf](http://www.cplusplus.com/reference/iostream/streambuf/)派生的緩衝區,因此''stringbuf'只是一個'string'的包裝器,它繼承自'streambuf'因此它可以在那裏使用。適配器或橋接模式的典型應用。 – 2012-04-25 11:53:09

回答

6

A std::stringbuf內部使用字符串緩衝數據,所以它可能會慢一點。我認爲差異不會很大,因爲它基本上只是代表團。可以肯定的是,你必須運行一些性能測試。

std::stringbuf當您希望IO流使用字符串作爲緩衝區(如std::stringstream,默認情況下使用std::stringbuf)時非常有用。

+0

這個問題仍然沒有答案:_is there __significand__ performance difference_。遵循你的邏輯:'std :: string'內部使用'char'數組,所以不,你應該堅持'char'數組。 – 2012-04-25 09:51:20

+0

@MaximYegorushkin:你說得對 - 我糾正了這一點。 – 2012-04-25 09:56:41

3

首先,std::stringbuf確實不是而是必須(或者甚至通常)使用std::string作爲其內部存儲。例如,該標準描述了從std::string初始化如下:

構建類的basic_stringbuf的目的...則拷貝 STR到的basic_stringbuf基礎字符序列中的內容[...]

請注意措辭:「字符序列」 - 至少對我來說,這似乎是非常小心,以避免說(甚至暗示)的內容應該存儲在一個實際的字符串。

過去,我認爲效率可能是一個紅鯡魚。它們都是相當薄的包裝器,用於管理某些類似字符序列的動態分配緩衝區。功能有很大差異(例如,string在字符串的中間有大量搜索和插入/刪除,stringbuf完全沒有)。考慮到它的目的,在類似std::deque之類的地方實施stringbuf以優化插入/刪除末端的(通常)路徑可能是有意義的,但這對於大多數用途可能是非實質性的。

如果我這樣做,我可能會被大多數的事實,stringbuf大概只能用stringstream一起測試擔心,所以如果我用它不同於stringstream這樣做,我可能會遇到的問題,即使我遵循標準所說的應該支持的內容。

0

std::stringbuf延伸std::string容器,用於讀寫std::string

通常,std::stringstd::stringbuf之間沒有顯着的性能差異。

因爲std::streambuf < - std::stringbuf,一方面是因爲:

typedef basic_stringbuf<char> stringbuf;  
typedef basic_string<char> string; 

閱讀this瞭解更多詳情。

相關問題