當我們必須使用字符串操作時,std :: string和std :: stringbuf之間是否存在任何顯着性能差異,如果是,爲什麼。performance stringbuf vs string
更一般的情況是,如果std :: stringbuf優於std :: string,
當我們必須使用字符串操作時,std :: string和std :: stringbuf之間是否存在任何顯着性能差異,如果是,爲什麼。performance stringbuf vs string
更一般的情況是,如果std :: stringbuf優於std :: string,
A std::stringbuf
內部使用字符串緩衝數據,所以它可能會慢一點。我認爲差異不會很大,因爲它基本上只是代表團。可以肯定的是,你必須運行一些性能測試。
std::stringbuf
當您希望IO流使用字符串作爲緩衝區(如std::stringstream
,默認情況下使用std::stringbuf
)時非常有用。
這個問題仍然沒有答案:_is there __significand__ performance difference_。遵循你的邏輯:'std :: string'內部使用'char'數組,所以不,你應該堅持'char'數組。 – 2012-04-25 09:51:20
@MaximYegorushkin:你說得對 - 我糾正了這一點。 – 2012-04-25 09:56:41
首先,std::stringbuf
確實不是而是必須(或者甚至通常)使用std::string
作爲其內部存儲。例如,該標準描述了從std::string
初始化如下:
構建類的basic_stringbuf的目的...則拷貝 STR到的basic_stringbuf基礎字符序列中的內容[...]
請注意措辭:「字符序列」 - 至少對我來說,這似乎是非常小心,以避免說(甚至暗示)的內容應該存儲在一個實際的字符串。
過去,我認爲效率可能是一個紅鯡魚。它們都是相當薄的包裝器,用於管理某些類似字符序列的動態分配緩衝區。功能有很大差異(例如,string
在字符串的中間有大量搜索和插入/刪除,stringbuf
完全沒有)。考慮到它的目的,在類似std::deque
之類的地方實施stringbuf
以優化插入/刪除末端的(通常)路徑可能是有意義的,但這對於大多數用途可能是非實質性的。
如果我這樣做,我可能會被大多數的事實,stringbuf
大概只能用stringstream
一起測試擔心,所以如果我用它不同於stringstream
這樣做,我可能會遇到的問題,即使我遵循標準所說的應該支持的內容。
std::stringbuf
延伸std::string
容器,用於讀寫std::string
。
通常,std::string
和std::stringbuf
之間沒有顯着的性能差異。
因爲std::streambuf
< - std::stringbuf
,一方面是因爲:
typedef basic_stringbuf<char> stringbuf;
typedef basic_string<char> string;
閱讀this瞭解更多詳情。
我實際上會問另一種方式:爲什麼當'string'有更多的方法可用時,heck使用'stringbuf',受虐狂?我想你來自Java或C#與他們的StringBuilder類變通... – 2012-04-25 10:58:58
@MatthieuM。:不,我是C++程序員,但是爲什麼ostringstream在內部使用stringbuf而不是字符串 – Guillaume07 2012-04-25 11:50:15
這完全不同。從'ostream'派生的所有類都使用從[streambuf](http://www.cplusplus.com/reference/iostream/streambuf/)派生的緩衝區,因此''stringbuf'只是一個'string'的包裝器,它繼承自'streambuf'因此它可以在那裏使用。適配器或橋接模式的典型應用。 – 2012-04-25 11:53:09