2012-04-25 13 views
6

文字列操作で作業する必要がある場合、std :: stringとstd :: stringbufの間には有意差がありますか?performance stringbuf対文字列

もっと一般的にstd :: stringbufをstd :: stringbufを使用すると良いですか?

+2

私は実際には別の方法で質問します。なぜなら、 'string'にはもっと多くのメソッドがあり、マゾヒズムがあるときにはなぜ' stringbuf'を使うのですか?私はあなたがStringBuilderクラスの回避策を使ってJavaまたはC#から来たとします。 –

+0

@MatthieuM。:いいえ私はC++プログラマーですが、ostringstreamは文字列の代わりにstringbufを内部的に使用しています – Guillaume07

+0

これはまったく異なっています。 'ostream'から派生するすべてのクラスは、[streambuf](http://www.cplusplus.com/reference/iostream/streambuf/)から派生したバッファを使用します。したがって、' stringbuf'は継承する 'string'の周りのラッパーです'streambuf'を使用することができます。アダプターまたはブリッジのパターンの典型的なアプリケーション。 –

答えて

6

std::stringbufは、データをバッファリングするために文字列を内部的に使用します。したがって、おそらく少し遅くなります。基本的には委任だけなので、違いは重要だとは思わない。あなたがいくつかのパフォーマンステストを実行しなければならないことを確かめるために。

std::stringbufは、IOストリームが文字列をバッファとして使用する場合に便利です(std::stringstreamなど、デフォルトでstd::stringbufを使用)。

+0

質問にはまだ答えがありません:_そこには__significand___パフォーマンスの差異_があります。あなたのロジックに従えば、 'std :: string'は内部的に' char'配列を使います。だから、 'char'配列だけを使うべきです。 –

+0

@ MaximYegorushkin:あなたは正しいです - 私はそれを修正しました。 –

3

まず、std::stringbufは、ではありません。は、内部ストレージとして必ずstd::stringを使用しています(通常はさらに通常使用します)。例えば、以下のように標準がstd::stringから初期化を説明:

構築クラスbasic_stringbufのオブジェクト...をコピーbasic_stringbuf基本となる文字列に STRの含有量[...]

「文字シーケンス」という言葉に注意してください。少なくとも私にとって、これはコンテンツが実際の文字列に格納されるべきであると言っている(または暗示している)ことを避けるために非常に注意しているようです。

過去は、効率はおそらく赤ちゃんだと思います。どちらも、ある種の文字のようなシーケンスの動的に割り当てられたバッファを管理するためのかなり薄いラッパーです。機能に大きな違いがあります(たとえば、には全く含まれていない文字列の中に、多くの検索と挿入/削除があります)。その目的を考えれば、std::dequeのようなものの上にstringbufを実装して、端の挿入/削除の(通常の)経路を最適化することができますが、ほとんどの用途ではそれほど実用的ではありません。

私はそれをやっていたならば、私はおそらくstringbufは、おそらく唯一のstringstreamと一緒にテストされているという事実によって、最も心配すると思いますので、私は違ったstringstreamがやったよりも、それを使用した場合、私は私はしても、問題が発生する可能性があります規格が支持しなければならないとしていることに従ってください。

0

std::stringbufstd::stringコンテナ、std::stringに読み書きします。

一般に、std::stringstd::stringbufの間には大きなパフォーマンス差はありません。詳細は

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

読むthisstd::stringbuf、両方のために -

std::streambuf <ので。

関連する問題